FZU 1894 志愿者选拔 - 单调队列

题目描述

分析:

暴力肯定过不了。维护一个从大到小的单调队列。
想清楚这些事:
1. 如果前面有人的val比当前加入队伍的人的val小,那么前面那个人的val永远对答案没有贡献,可以删去。
2. 再有就是要删除出队的人,但由于是按照先入队先出队的顺序来删,可以先把这些人的val保留在单调队列里面,下一次找最大RP_val的时候把这些不合法的删掉即可。
注意:当当前实际队伍里面没有人的时候输出 “-1”

#include<cstdio>
#define MAXL 1000000

struct node{
    int pos,val;
}que[MAXL+10];
char s[20];

int main()
{
    int T;
    scanf("%d",&T);
    while(T--){
        scanf("%s",s);
        int front=0,rear=0,cnt=0,del=0,x;
        while(scanf("%s",s)){
            if(s[0]=='E')
                break;
            if(s[0]=='C'){
                scanf("%s%d",s,&x);
                while(front<rear){
                    if(que[rear-1].val<=x)
                        rear--;
                    else
                        break;
                }
                que[rear].pos=++cnt,que[rear].val=x;
                rear++;
            }
            else if(s[0]=='G')
                del++;
            else{
                while(front<rear){
                    if(que[front].pos<=del)
                        front++;
                    else
                        break;
                }
                if(del==cnt)
                    printf("-1\n");
                else
                    printf("%d\n",que[front].val);
            }
        }
    }
}
posted @ 2016-02-04 14:09  KatarinaYuan  阅读(98)  评论(0编辑  收藏  举报