Problem 1894 志愿者选拔
Accept: 1176 Submit: 3717
Time Limit: 1500 mSec Memory Limit : 32768 KB
Problem Description
Input
输入 | 含义 | |
1 | C NAME RP_VALUE | 名字为NAME的人品值为RP_VALUE的同学加入面试队伍。(名字长度不大于5,0 <= RP_VALUE <= 1,000,000,000) |
2 | G | 排在面试队伍最前面的同学面试结束离开考场。 |
3 | Q | 主面试官John想知道当前正在接受面试的队伍中人品最高的值是多少。 |
Output
Sample Input
2STARTC Tiny 1000000000C Lina 0QGQENDSTARTQC ccQ 200C cxw 100QGQC wzc 500QEND
Sample Output
10000000000-1200100500
Hint
数据较大建议使用scanf,printf 不推荐使用STL
单调队列类似于堆。能够在O(1)的时间内找到队列里面的最大值或者最小值,而此题求的是最大值,所以每加入一个数要把它放入队列里面并维护好排序,而队列已经从大到小排好序了。然后将每个元素加入队列的顺序记录下来,这样解决就不会超时了。
#include<stdio.h>
#include<string.h>
char name[7],s[7];
struct sa
{
int id,rp;
}p[1000007];
int main()
{
int t;
scanf("%d",&t);
while(t--)
{
memset(p,0,sizeof(p));
scanf("%s",s);
int head=0,tail=-1,num=0,leave=0;
while(true)
{
scanf("%s",s);
if(s[0]=='E')break;
else if(s[0]=='C')
{
sa tmp;
tmp.id=++num;
scanf("%s%d",name,&tmp.rp);
while(head<=tail&&p[tail].rp<=tmp.rp)
tail--;
p[++tail]=tmp;
}
else if(s[0]=='Q')
{
while(head<=tail&&p[head].id<=leave)
head++;
if(head>tail)printf("-1\n");
else printf("%d\n",p[head].rp);
}
else if(s[0]=='G')
{
leave++;
}
}
}
return 0;
}