思路:数据范围已经不能用堆模拟了。考虑先将 \(a_i\) 从大到小排序,将 \(a_i\) 依次放入队列q1,每次将砍掉后的第一段放入q2,第二段放入q3,则q1,q2,q3都单调递减。因此每次被砍的长度为q1,q2,q3队首的最大值。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=100000000007;
const int N=100005;
int n,m,q,u,v,t,a[N],d;
queue<int>q1,q2,q3;
bool cmp(const int &a,const int &b)
{
return a>b;
}
int max(int a,int b)
{
return a>b?a:b;
}
signed main()
{
scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&q,&u,&v,&t);
for(int i=1;i<=n;++i)scanf("%lld",&a[i]);
sort(a+1,a+n+1,cmp);
for(int i=1;i<=n;++i)q1.push(a[i]);
for(int i=1;i<=m;++i)
{
int mx=-inf;
if(q1.size())mx=max(mx,q1.front());
if(q2.size())mx=max(mx,q2.front());
if(q3.size())mx=max(mx,q3.front());
if(q1.size()&&q1.front()==mx)q1.pop();
else if(q2.size()&&q2.front()==mx)q2.pop();
else if(q3.size()&&q3.front()==mx)q3.pop();
mx+=d;
if(i%t==0)printf("%lld ",mx);
d+=q;
int len=mx*u/v;
q2.push(len-d);
q3.push(mx-len-d);
}
puts("");
for(int i=1;i<=n+m;++i)
{
int mx=-inf;
if(q1.size())mx=max(mx,q1.front());
if(q2.size())mx=max(mx,q2.front());
if(q3.size())mx=max(mx,q3.front());
if(q1.size()&&q1.front()==mx)q1.pop();
else if(q2.size()&&q2.front()==mx)q2.pop();
else if(q3.size()&&q3.front()==mx)q3.pop();
if(i%t==0)printf("%lld ",mx+d);
}
puts("");
return 0;
}