题目大意
有一些蚯蚓,每次取最长的切成两段,其余增长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; }