思路

对于每条蚯蚓,用一个结构体pair<int,long long>维护它最近一次被切的时间点以及它的长度,同时使用三个队列分别维护原来的蚯蚓、px部分的蚯蚓以及x-px部分的蚯蚓,每次选最长蚯蚓时比较三个队列队头元素即可

Code

#include <iostream>
#include <algorithm>
#include <cmath>
#include <vector>
#include <list>
#include <stack>
#include <queue>
#include <cstdio>
#include <cstdlib>
#include <string>
#include <set>
#include <map>
#include <unordered_map>
#include <deque>
#include <tuple>
#include <bitset>
#define ios std::ios::sync_with_stdio(false);std::cin.tie(0)
#define MAXINT 1e9+7
#define ll long long
#define pb push_back
#define mpr make_pair
#define FOR(i,m,n) for(int i = m;i < n;i++)
#define FORR(i,m,n) for(int i = m;i >= n;i--)
#define FOR_epr(i,m,epr) for(int i = m;epr;i++)
#define FORR_epr(i,m,epr) for(int i = m;epr;i--)
using namespace std;

int n,m,q,u,v,t;
double p;
ll a[100010];

void solve(){
    queue<pair<int, ll>> qu[3];    //1->px,2->x-px
    cin>>n>>m>>q>>u>>v>>t;
    p = (u*1.0)/v;
    FOR(i,0,n) cin>>a[i];
    sort(a,a+n,[](ll x,ll y){ return x >= y; });
    //转存至队列first表示切割时间点,second表示长度
    FOR(i,0,n) qu[0].push(mpr(1,a[i]));
    ll tmp = (qu[0].front()).second;
    FOR(i,1,m+1){
        ll mx = -0x3f3f3f3f,flag = -1;
        if(qu[0].size() && ((qu[0].front()).second +
           (i - (qu[0].front()).first)*q > mx)){
            mx = qu[0].front().second + (i - (qu[0].front()).first)*q;
            flag = 0;
        }
        if(qu[1].size() && ((qu[1].front()).second +
           (i - (qu[1].front()).first)*q > mx)){
            mx = qu[1].front().second + (i - (qu[1].front()).first)*q;
            flag = 1;
        }
        if(qu[2].size() && ((qu[2].front()).second +
           (i - (qu[2].front()).first)*q > mx)){
            mx = qu[2].front().second + (i - (qu[2].front()).first)*q;
            flag = 2;
        }
        if(i%t == 0) cout<<mx<<" ";
        qu[1].push(mpr(i+1,floor(mx*p)));
        qu[2].push(mpr(i+1,mx - floor(mx*p)));
        qu[flag].pop();
    }
    cout<<'\n';
    FOR(i,1,n+m+1){
        ll mx = -0x3f3f3f3f,flag = -1;
        if(qu[0].size() && ((qu[0].front()).second +
           (m+1 - (qu[0].front()).first)*q > mx)){
            mx = qu[0].front().second + (m+1 - (qu[0].front()).first)*q;
            flag = 0;
        }
        if(qu[1].size() && ((qu[1].front()).second +
           (m+1 - (qu[1].front()).first)*q > mx)){
            mx = qu[1].front().second + (m+1 - (qu[1].front()).first)*q;
            flag = 1;
        }
        if(qu[2].size() && ((qu[2].front()).second +
           (m+1 - (qu[2].front()).first)*q > mx)){
            mx = qu[2].front().second + (m+1 - (qu[2].front()).first)*q;
            flag = 2;
        }
        if(i%t == 0) cout<<mx<<" ";
        qu[flag].pop();
    }
}

int main(){    
    ios;
    int T = 1;
    //cin>>T;
    while(T--) solve();
    return 0;
}