题目大意

有一些蚯蚓,每次取最长的切成两段,其余增长q,求每次切掉的蚯蚓的长度以及最后所有蚯蚓的长度

算法

由于先切掉的一定比后切掉的长,所以我们不需要堆,直接队列即可

所以我们可以使用三个队列,一个存原来的,另外两个存切开的

然后每次从三个队列的队首取最大值切开

然后我们用sum存所有蚯蚓的增长量,对于切开的两个减掉即可

代码

#include <cstdio>
#include <algorithm>
#define MAXN 10000005
int q1[MAXN],q2[MAXN],q3[MAXN];
int head1,head2,head3,tail1,tail2,tail3;
int max3(){
    int mx=-(1<<30),tm=0;
    if(q1[head1]>mx && head1<=tail1)mx=q1[head1],tm=1;
    if(q2[head2]>mx && head2<=tail2)mx=q2[head2],tm=2;
    if(q3[head3]>mx && head3<=tail3)mx=q3[head3],tm=3;
    switch(tm){
        case 1:head1++;break;
        case 2:head2++;break;
        case 3:head3++;break;
    }
    return mx;
}
int main(){
    int n,m,q,u,v,t;
    scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);
    for(int i=1;i<=n;i++)scanf("%d",&q1[i]);
    head1=1,tail1=n,head2=head3=1,tail2=tail3=0;
    std::sort(q1+1,q1+n+1,[](int x,int y){return x>y;});
    int sum=0;
    for(int i=1;i<=m;i++){
        int x=max3()+sum;
        if(i%t==0)printf("%d ",x);
        int l=(long long)x*u/v,r=x-l;
        sum+=q;
        q2[++tail2]=l-sum;
        q3[++tail3]=r-sum;
    }
    printf("\n");
    int te=n+m;
    for(int i=1;i<=te;i++){
        int x=max3()+sum;
        if(i%t==0)printf("%d ",x);
    }
    printf("\n");
    return 0;
}