luogu P2827 蚯蚓
#include<stdio.h> #include<queue> #include<algorithm> using namespace std; int n;int m;int q;int u;int v;int t; queue <int> q1;queue <int> q2;queue <int> q3; inline int maxnum()//取最大值的操作 { int res=-0x3f3f3f3f;int num=0; if(!q1.empty()&&res<q1.front())res=q1.front(),num=1; if(!q2.empty()&&res<q2.front())res=q2.front(),num=2; if(!q3.empty()&&res<q3.front())res=q3.front(),num=3; if(num==1)q1.pop(); else if(num==2)q2.pop(); else if(num==3)q3.pop(); return res; } int a[100000];int now;int j; int main() { scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t); for(int i=0;i<n;i++) { scanf("%d",&a[i]); } sort(a,a+n); for(int i=n-1;i>=0;i--)//倒着扫!(敲黑板)sort最大值在最后 { q1.push(a[i]); } for(int i=1;i<=m;i++,j+=q)//据说这样可以减少运算,priority_queue想卡常结果失败。。 { int te=maxnum()+j; if(i%t==0)printf("%d ",te); //printf("ais%d bis%d\n",t*u/v-i*q,t-t*u/v-i*q); int ma=max(1LL*te*u/v-j-q,te-1LL*te*u/v-j-q);q2.push(ma);//大的放q2,小的放q3 int mi=min(1LL*te*u/v-j-q,te-1LL*te*u/v-j-q);q3.push(mi); } printf("\n"); for(int i=1;!q1.empty()||!q2.empty()||!q3.empty();i++) { int res=maxnum(); if(i%t==0)printf("%d ",res+j); } return 0; }