fzu 1894 志愿者选拔 单调队列

Problem 1894 志愿者选拔

Accept: 1205    Submit: 3808
Time Limit: 1500 mSec    Memory Limit : 32768 KB

Problem 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

Source

福州大学第七届程序设计竞赛
 
 
 1 /*

 2 单调队列维护。

 3 以单调递减队列为例。10 9 8 7 6 ...

 4 初始化

 5 head = 0; tail = -1;

 6 进队列:从后往前查找。满足  while( head<=tail  && q[ tail ].rp < tmp.rp ) tail --;

 7                                             此时相当于舍弃 tail 原来保存到的数据。

 8 出队列:从前往后查找。满足  while( head<=tail  && q[ tail ].num <= conunt ) head ++;

 9                                             此时相当于避免比当前值先进来,却又比较大的值,被输出。

10 */

11 

12 #include<iostream>

13 #include<stdio.h>

14 #include<cstring>

15 #include<cstdlib>

16 using namespace std;

17 

18 typedef struct

19 {

20     char name[10];

21     int num;

22     int rp;

23 }Queue;

24 Queue q[1000010];

25 int main()

26 {

27     int T,head,tail,Num,conunt;

28     char cur[10];

29     Queue temp;

30     while(scanf("%d",&T)>0)

31     {

32         getchar();

33         while(T--)

34         {

35             head=0;

36             tail = -1;

37             Num=0;conunt = 0;

38             while(scanf("%s",cur)>0)

39             {

40                 if(cur[0]=='S') continue;

41                 if(cur[0]=='E') break;

42                 if(cur[0]=='C')

43                 {

44                     scanf("%s %d",temp.name,&temp.rp);

45                     temp.num=++Num;

46 

47                     while(head<=tail && q[tail].rp<temp.rp)

48                         tail--;

49                     q[++tail]=temp;

50                 }

51                 else if(cur[0]=='Q')

52                 {

53                     while(head<=tail && q[head].num<=conunt) 

54                         head++;// 为了解决 比当前的先进来,但是此时最大值的时候。

55                     if( head>tail )

56                         printf("-1\n");

57                     else printf("%d\n",q[head].rp);

58                 }

59                 else if(cur[0]=='G')

60                     conunt++;

61             }

62         }

63     }

64     return 0;

65 }

 

你可能感兴趣的:(队列)