FZU1894 单调队列

S - 1019

Time Limit:1500MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

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想知道当前正在接受面试的队伍中人品最高的值是多少。

最后一行为”END”,表示所有的面试结束,面试的同学们可以依次离开了。

所有参加面试的同学总人数不超过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
代码:简单的单调队列
 /*
单调队列记录的是标号而不是值,因为要有人离开,
*/
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
int t;
char ch[];
char na[];
long long va[];
int head,tail;
long long ddq[];
int main()
{
scanf("%d",&t);
while(t--)
{
head=;tail=;
int k=,kk=;//KK记录正在排队的同学中队首的人
memset(ddq,,sizeof(ddq));
scanf("%s",ch);
if(ch[]=='S')
while(scanf("%s",ch))
{
if(ch[]=='E')
break;
if(ch[]=='C')
{
k++;
scanf("%s%lld",na,&va[k]);
while(tail>=head&&va[k]>=va[ddq[tail]])
tail--;
tail++;
ddq[tail]=k;
}
else if(ch[]=='Q')
{
if(head<=tail)
printf("%lld\n",va[ddq[head]]);
else printf("-1\n");
}
else if(ch[]=='G')
{
kk++;//去掉一个人
if(ddq[head]<kk)//若去掉的人是队伍头的人单调队列队首++
head++;
}
} }
return ;
}
上一篇:linux系统下nodejs安装过程随记


下一篇:C#与C++的发展历程第一 - 由C#3.0起