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