从大到小排序,放入一个队列,每次切放进另外两个队列,每次切三个队列队首的最大值,伸长变为排序。
#include <bits/stdc++.h>
#define LL long long
using namespace std;
const LL Max=7e6+5;
const LL Inf=1e18;
LL N,M,Q,U,V,T,L,H[Max],Head[Max],Tail[Max],Que[3][Max];
inline LL Read(){
LL X=0;char CH=getchar();bool F=0;
while(CH>'9'||CH<'0'){if(CH=='-')F=1;CH=getchar();}
while(CH>='0'&&CH<='9'){X=(X<<1)+(X<<3)+CH-'0';CH=getchar();}
return F?-X:X;
}
inline void Write(LL X){
if(X<0)X=-X,putchar('-');
if(X>9)Write(X/10);
putchar(X%10+48);
}
bool Cmp(int P,int Q){
return P>Q;
}
int main(){
LL I,J,K;
N=Read(),M=Read(),Q=Read(),U=Read(),V=Read(),T=Read();
memset(Que,128,sizeof(Que));
for(I=1;I<=N;I++){
H[I]=Read();
}
sort(H+1,H+1+N,Cmp);
for(I=1;I<=N;I++){
Que[0][I]=H[I];
}
Head[0]=1;Tail[0]=N;
Head[1]=1;Tail[1]=0;
Head[2]=1;Tail[2]=0;
for(I=1;I<=M;I++){
LL Max_L=-Inf,Max_Id;
for(J=0;J<=2;J++){
if(Head[J]<=Tail[J]&&Max_L<Que[J][Head[J]]){
Max_L=Que[J][Head[J]],Max_Id=J;
}
}
Max_L+=L;
LL Len1=(Max_L*U/V);
LL Len2=Max_L-Len1;
if(I%T==0){
Write(Max_L),putchar(' ');
}
Head[Max_Id]++;L+=Q;
Que[1][++Tail[1]]=Len1-L;Que[2][++Tail[2]]=Len2-L;
}
putchar('\n');
for(I=1;I<=N+M;I++){
LL Max_L=-Inf,Max_Id;
for(J=0;J<=2;J++){
if(Head[J]<=Tail[J]&&Max_L<Que[J][Head[J]]){
Max_L=Que[J][Head[J]],Max_Id=J;
}
}
Head[Max_Id]++;
if(I%T==0){
Write(Max_L+L),putchar(' ');
}
}
return 0;
}