P2827 蚯蚓

匿名 (未验证) 提交于 2019-12-03 00:05:01

题面:https://www.luogu.org/problem/P2827

本题首先可以发现先被切掉的蚯蚓分成的蚯蚓一定比后切掉的蚯蚓分成的蚯蚓大.  假设这两只蚯蚓分别为a,b,其中a>b.那么它被切成a1,a2t秒后, b被切成了b1,b2.此时a1,a2p*la+t,(1p)*la+t b1,b2的长度为p(lb+t),(1p)(lb+t), 显然la1>lb1,la2>lb2,也就是说: 如果有蚯蚓a1,a2an满足a1>a2an,那么以此分成两只a11,a12,a21,a22an1,an2, 那么就有a11>a21an1,a12>a22an2 那么就可以将这两堆依次存储, 加上还没被切过的蚯蚓.每次要切时在这三堆里面选择最大的, 切完再依次放回去即可. 时间复杂度为O(m)  Code: #include<iostream> #include<cstdio> #include<cmath> #include<algorithm> #include<cstring> using namespace std; const int N=7000005;  int n,m,q,u,v,t,a[N],d; long long h[4],x[4],b[4][N]; int main(){     scanf("%d%d%d%d%d%d",&n,&m,&q,&u,&v,&t);     for(int i=1;i<=n;i++){         scanf("%d",&a[i]);     }     sort(a+1,a+1+n);     for(int i=1;i<=n;i++){         b[1][n-i+1]=a[i];     }     h[1]=h[2]=h[3]=1;     x[1]=n,x[2]=x[3]=d=0;     for(int i=1;i<=m;i++){         int ans=-1<<30,num=0;         for(int j=1;j<=3;j++)             if(h[j]<=x[j]&&b[j][h[j]]>ans){                 ans=b[j][h[j]],num=j;             }         if(i%t==0){             printf("%d ",ans+d);         }         h[num]++;         b[2][++x[2]]=(long long)(ans+d)*u/v-d-q;         b[3][++x[3]]=ans+d-(long long)(ans+d)*u/v-d-q;         d=d+q;     }     printf("\n");     for(int i=1;i<=n+m;i++){         int ans=-1<<30,num=0;         for(int j=1;j<=3;j++){             if(h[j]<=x[j]&&b[j][h[j]]>ans){                 ans=b[j][h[j]],num=j;             }         }         if(i%t==0){             printf("%d ",ans+d);         }         h[num]++;     }     return 0; }
标签
易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!