解析:
性质:蚯蚓i长度>蚯蚓j长度。i蚯蚓切断后的两端长度都大于j蚯蚓切断后的两端长度。因此单调递减
根据性质我们用三个队列来模拟优先队列。
一个队列存放蚯蚓的长度。一个队列存放切断蚯蚓后左边的长度,一个队列存放切断蚯蚓后右边的长度。因此每次找最长的蚯蚓,我们只要比较着三个队列的队头谁最大即可。
用一个额外变量存储每次蚯蚓增加的长度,队列里面保持长度没有增加过
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=7e6+1000;
ll a[N];
ll n,m,q,u,v,t;
queue<ll> q1,q2,q3;
bool cmp(int a,int b)
{
return a>b;
}
ll calc(int t)
{
int x=-1e8,a=-1e8,b=-1e8,c=-1e8;
if(!q1.empty()) a=q1.front()+t*q;
if(!q2.empty()) b=q2.front()+t*q;
if(!q3.empty()) c=q3.front()+t*q;
x=max(a,max(b,c));
if(x==a) q1.pop();
else if(x==b) q2.pop();
else if(x==c) q3.pop();
return x;
}
int main()
{
cin>>n>>m>>q>>u>>v>>t;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+1+n,cmp);
for(int i=1;i<=n;i++) q1.push(a[i]);
for(int i=1;i<=m;i++)
{
ll x=calc(i-1);
if(i%t==0) cout<<x<<" ";
int now=x*u/v;
int now1=x-now;
q2.push(now-i*q);
q3.push(now1-i*q);
}
cout<<endl;
for(int i=1;i<=n+m;i++)
{
ll x=calc(m);
if(i%t==0) cout<<x<<" ";
}
}