志愿者选拔(单调队列)

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

2STARTC Tiny 1000000000C Lina 0QGQENDSTARTQC ccQ 200C cxw 100QGQC wzc 500QEND

Sample Output

10000000000-1200100500
//http://acm.hust.edu.cn/vjudge/contest/view.action?cid=82285#problem/H
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
#include 
using namespace std;
int a[1000001],n,k;
int que[1000001],r,f;
/*void increasepush(int i)//递增
{
    while(r>f&&a[i]f&&a[i]>a[que[r-1]])//插入元素到队列
    {
        r--;
    }
    que[r]=i;
    r++;
}
inline int isempty()
{
    if(f==r)
        return 1;
    else return 0;
}
inline int Front()
{
    return que[f];
}
inline void pop()
{
    f++;
}
int main()
{
    int t,num,l;
   char st[10],en[10],name[6];
   scanf("%d",&t);
   while(t--)
   {
       scanf("%s",st);
       l=num=0;//l,num表示a数组的头和尾节点
       f=r=0;//f,r表示队列的头部和节点
       memset(a,0,sizeof a);
       while(st[0]=='S')
       {
           scanf("%s",en);
           while(a[Front()]==-1)pop();//把队首的节点号取出来,如果在a中是-1.
                             //则该点出队了,而不是队首元素,直接pop
           if(en[0]=='E')break;
           if(en[0]=='C')
           {
               scanf("%s%d",name,&a[++num]);
               reducepush(num);//加入队列
           }
           if(en[0]=='G')//将a数组中的头部出队
           {
               if((++l)<=num)
                {
                  a[l]=-1;//直接将此点赋值为-1
                }
           }
           if(en[0]=='Q')
           {
               if(isempty())printf("-1\n");//如果队列为空输出-1
               else printf("%d\n",a[Front()]);//输出队首元素
           }
       }
   }

    return 0;
}

你可能感兴趣的:(数据结构)