Problem 1894 志愿者选拔
Accept: 772 Submit: 2529
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 不推荐使用STLSource
福州大学第七届程序设计竞赛题意:一堆人在排队面试,每个人有不同的RP值,每次可能问当前排队的人的最大RP,或者让第一个人离开
分析:这题如果之前做过单调队列,应该是一眼就知道怎么做的了直接边输入边维护,询问就输出,离开就出队
PS:这题我居然wa了4次,我遇到简单题总是这么大意,这个毛病得改改啊,主要是简单的把队列头出队了,其实要判断队列头是否该出队的= =
代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int mm=1111111;
int rp[mm],q[mm];
int main()
{
int l,r,n,out,t;
char op[9],name[9];
scanf("%d",&t);
while(t--)
{
out=n=l=0,r=-1;
while(scanf("%s",op),op[0]!='E')
{
if(op[0]=='C')
{
++n;
scanf("%s%d",name,&rp[n]);
while(l<=r&&rp[q[r]]<rp[n])--r;
q[++r]=n;
}
if(op[0]=='Q')
printf("%d\n",out<n?rp[q[l]]:-1);
if(op[0]=='G')(++out>=q[l])?++l:l;
}
}
return 0;
}