LOJ P2362 [NOIP2016] 蚯蚓【模拟】

从大到小排序,放入一个队列,每次切放进另外两个队列,每次切三个队列队首的最大值,伸长变为排序。

#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;
}

猜你喜欢

转载自blog.csdn.net/yanzhenhuai/article/details/81323482