[LUOGU] P2827 蚯蚓

 

优先队列模拟题意,有60分

看了题解,蚯蚓切割后长度单调下降,可以用三个队列分别维护:未切割的蚯蚓,切割后长的蚯蚓,切割后短的蚯蚓。

每次从三个队头取出最大的,进行切割即可。

自己写了个残缺的queue,qwq

 

#include<algorithm>
#include<iostream>
#include<cstdio>
#include<queue>
#include<cmath>
#define int long long
using namespace std;

inline int rd(){
    int ret=0,f=1;char c;
    while(c=getchar(),!isdigit(c))f=c=='-'?-1:1;
    while(isdigit(c))ret=ret*10+c-'0',c=getchar();
    return ret*f;
}

const int MAXN=10000005;

int n,m,q,u,v,t;
int T;
int data[MAXN];
struct Node{
    int len,tim;
    Node(int x=0,int y=0){len=x;tim=y;}
    long long calc(){return max(len+(T-tim)*q,0ll);}
};

struct Queue{
    Node val[MAXN];
    int front,tail;
    Queue(){front=1;tail=0;}
    void add(int x,int tim){val[++tail]=Node(x,tim);}
    int pop(){return front<=tail?val[front++].calc():-1;}
    int top(){return front<=tail?val[front].calc():-1;}
}Q[3];

long double pos;

void gmax(int &id,int &val){
    int ret=0;
    if(Q[0].top()<Q[1].top()) ret=1;else ret=0;
    if(Q[ret].top()<Q[2].top()) ret=2;
    id=ret;val=Q[id].top();
}

signed main(){
    n=rd();m=rd();q=rd();
    u=rd();v=rd();t=rd();
    pos=1.0*u/v;
    int x,y;
    
    for(int i=1;i<=n;i++) {
        data[i]=-rd();
    }
    sort(data+1,data+1+n);
    for(int i=1;i<=n;i++) Q[0].add(-data[i],1);
    for(T=1;T<=m;T++){
        gmax(x,y);
        Q[1].add(floor(y*pos),T+1);
        Q[2].add(y-floor(y*pos),T+1);
        Q[x].pop();
        if(!(T%t)) printf("%lld ",y);
    }
    puts("");
    for(int i=1;i<=m+n;i++){
        gmax(x,y);
        Q[x].pop();
        if(!(i%t)) printf("%lld ",y);
    }
    return 0;
}

 

posted @ 2018-07-26 11:41  GhostCai  阅读(89)  评论(0编辑  收藏  举报