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);
}
}
}
}