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);
            }
        }
    }
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章