FZU 1894 单调队列入门

2014-11-23 21:39:27 · 作者: · 浏览: 10
\ Problem 1894 志愿者选拔

Accept: 1296 Submit: 4081
Time Limit: 1500 mSec Memory Limit : 32768 KB

\ Problem Description

世博会马上就要开幕了,福州大学组织了一次志愿者选拔活动。
参加志愿者选拔的同学们排队接受面试官们的面试。参加面试的同学们按照先来先面试并且先结束的原则接受面试官们的考查。
面试中每个人的人品是主要考查对象之一。(提高人品的方法有扶老奶奶过街,不闯红灯等)
作为主面试官的John想知道当前正在接受面试的同学队伍中人品值最高的是多少。于是他请你帮忙编写一个程序来计算。

\ Input

< http://www.2cto.com/kf/ware/vc/" target="_blank" class="keylink">vcD4KyuTI68r9vt212tK70NDOqtK71fvK/VSjrLHtyr7T0FTX6crkyOvK/b7doaPDv9fpyv2+3bXa0rvQ0M6qobFTVEFSVKGxo6yx7cq+w+bK1L+qyrw8YnI+Cr3Tz8LAtLXEyv2+3dbQ09DI/dbWx+m/9qO6PGJyPgo8dGFibGUgY2VsbHNwYWNpbmc9"1" align="center" border="1" width="80%"> 输入 含义 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

\ Hint

数据较大建议使用scanf,printf不推荐使用STL

\ Source

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


单调队列裸题,用一个双端队列维护一个递减的序列,然后扫一遍就行,由于数据规模超大,nlogn的方法会tle,单调队列也只能飘过。

代码:

/* ***********************************************
Author :_rabbit
Created Time :2014/5/12 22:14:46
File Name :20.cpp
************************************************ */
#pragma comment(linker, "/STACK:102400000,102400000")
#include 
  
   
#include 
   
     #include 
    
      #include 
     
       #include 
      
        #include 
       
         #include 
        
          #include 
         
           #include 
          
            #include 
           
             #include 
            
              #include 
             
               #include 
              
                #include 
                using namespace std; #define INF 0x3f3f3f3f #define eps 1e-8 #define pi acos(-1.0) typedef long long ll; int que[1001000],a[1001000]; int main() { //freopen("data.in","r",stdin); //freopen("data.out","w",stdout); int T,head,end,front,tail; char str[100],ss[223]; scanf("%d",&T); while(T--){ front=tail=head=end=0; scanf("%s",str); while(~scanf("%s",str)&&str[0]!='E'){ if(str[0]=='C'){ scanf("%s",ss); scanf("%d",&a[end++]); while(front