FZU1894 单调队列
Description
世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动。
参加志愿者选拔的同学们排队接受面试官们的面试。参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查。
面试中每个人的人品是主要考查对象之一。(提高人品的方法有扶老奶奶过街,不闯红灯等)
作为主面试官的John想知道当前正在接受面试的同学队伍中人品值最高的是多少。于是他请你帮忙编写一个程序来计算。
Input
输入数据第一行为一整数T,表示有T组输入数据。 每组数据第一行为”START”,表示面试开始
接下来的数据中有三种情况:
输入 | 含义 | |
1 | C NAME RP_VALUE | 名字为NAME的人品值为RP_VALUE的同学加入面试队伍。(名字长度不大于5,0 <= RP_VALUE <= 1,000,000,000) |
2 | G | 排在面试队伍最前面的同学面试结束离开考场。 |
3 | Q | 主面试官John想知道当前正在接受面试的队伍中人品最高的值是多少。 |
所有参加面试的同学总人数不超过1,000,000
Output
对于每个询问Q,输出当前正在接受面试的队伍中人品最高的值,如果当前没有人正在接受面试则输出-1。
Sample Input
2 START C Tiny 1000000000 C Lina 0 Q G Q END START Q C ccQ 200 C cxw 100 Q G Q C wzc 500 Q END
Sample Output
1000000000 0 -1 200 100 500
Hint
数据较大建议使用scanf,printf 不推荐使用STL
代码:简单的单调队列
1 /* 2 单调队列记录的是标号而不是值,因为要有人离开, 3 */ 4 #include<iostream> 5 #include<cstdio> 6 #include<cstring> 7 using namespace std; 8 int t; 9 char ch[10]; 10 char na[10]; 11 long long va[1000005]; 12 int head,tail; 13 long long ddq[1000005]; 14 int main() 15 { 16 scanf("%d",&t); 17 while(t--) 18 { 19 head=1;tail=0; 20 int k=0,kk=1;//KK记录正在排队的同学中队首的人 21 memset(ddq,0,sizeof(ddq)); 22 scanf("%s",ch); 23 if(ch[0]=='S') 24 while(scanf("%s",ch)) 25 { 26 if(ch[0]=='E') 27 break; 28 if(ch[0]=='C') 29 { 30 k++; 31 scanf("%s%lld",na,&va[k]); 32 while(tail>=head&&va[k]>=va[ddq[tail]]) 33 tail--; 34 tail++; 35 ddq[tail]=k; 36 } 37 else if(ch[0]=='Q') 38 { 39 if(head<=tail) 40 printf("%lld\n",va[ddq[head]]); 41 else printf("-1\n"); 42 } 43 else if(ch[0]=='G') 44 { 45 kk++;//去掉一个人 46 if(ddq[head]<kk)//若去掉的人是队伍头的人单调队列队首++ 47 head++; 48 } 49 } 50 51 } 52 return 0; 53 }