题解——洛谷P2827 NOIP提高组 2016 蚯蚓
队列模拟
详细题解待填坑
#include <cstdio> #include <algorithm> #include <queue> #include <cmath> using namespace std; int n,m,q,u,v,t,addl=0; int qx[3][7000005]; int to[4]={1,1,1,1},ta[4]={0}; int add[7000005]={0},inq=0; int mid[7000005]; double p; int ans[7000005]; bool cmp(int a,int b){ if(a>b) return true; return false; } int main(){ scanf("%d %d %d %d %d %d",&n,&m,&q,&u,&v,&t); p=(double)u/(double)v; for(ta[0]=1;ta[0]<=n;ta[0]++){ scanf("%d",&mid[ta[0]]); } --ta[0]; sort(mid+1,mid+1+ta[0],cmp); int tp; for(int i=1;i<=m;i++){ if(to[0]>ta[0]){ if(qx[1][to[1]]>qx[2][to[2]]) tp=qx[1][to[1]++]; else tp=qx[2][to[2]++]; } else if(mid[to[0]]>=qx[1][to[1]]&&mid[to[0]]>=qx[2][to[2]]) tp=mid[to[0]],++to[0]; else if(qx[1][to[1]]>=qx[2][to[2]]&&mid[to[0]]<=qx[1][to[1]]) tp=qx[1][to[1]],++to[1]; else tp=qx[2][to[2]],++to[2]; tp+=addl; int a1=floor(p*(double)tp); int a2=tp-a1; addl+=q; a1-=addl; a2-=addl; qx[1][++ta[1]]=a1; qx[2][++ta[2]]=a2; if(i%t==0) printf("%d ",tp); } printf("\n"); for(int i=to[0];i<=ta[0];i++) ans[++inq]=mid[i]; for(int i=to[1];i<=ta[1];++i) ans[++inq]=qx[1][i]; for(int i=to[2];i<=ta[2];++i) ans[++inq]=qx[2][i]; sort(ans+1,ans+inq+1,cmp); for(int i=1;i<=inq;++i){ if(i%t==0) printf("%d ",ans[i]+addl); } return 0; }