题解——洛谷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("
");    
    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;
}
原文地址:https://www.cnblogs.com/dreagonm/p/9433537.html