p2827 蚯蚓

分析

我们设置三个队列

分别表示没有被切过,切出来的头,切出来的尾

我们不难发现对于每一个队列里的值从头到尾一定递减

于是每次取三个队列队首的最大值即可

代码

#include<bits/stdc++.h>
using namespace std;
#define int long long
queue<int>q[3];
int a[200100],n,m,Q,u,v,t;
signed main(){
    int i,j,k;
    scanf("%lld%lld%lld%lld%lld%lld",&n,&m,&Q,&u,&v,&t);
    for(i=1;i<=n;i++)scanf("%lld",&a[i]);
    sort(a+1,a+n+1);
    for(i=n;i>0;i--)q[0].push(a[i]);
    for(i=1;i<=m;i++){
      int wh=0,pl;
      for(j=0;j<3;j++)if(!q[j].empty())if(q[j].front()+Q*(i-1)>wh)wh=q[j].front()+Q*(i-1),pl=j;
      if(i%t==0)printf("%lld ",wh);
      q[pl].pop();
      int x1=wh*u/v,x2=wh-x1;
      x1-=Q*i,x2-=Q*i;
      q[1].push(x1),q[2].push(x2);
    }
    puts("");
    int sum=0;
    while(!q[0].empty()||!q[1].empty()||!q[2].empty()){
      sum++;
      int wh=-1,pl=-1;
      for(j=0;j<3;j++)if(!q[j].empty())if(q[j].front()+Q*m>wh)wh=q[j].front()+Q*m,pl=j;
      if(sum%t==0)printf("%lld ",wh);
      q[pl].pop();
    }
    puts("");
    return 0;
}

 

posted @ 2019-09-30 10:24  水题收割者  阅读(148)  评论(0编辑  收藏  举报