fzu 1894 志愿者选拔(双端队列)

2014-11-24 02:59:11 · 作者: · 浏览: 2

题目链接:fzu 1894 志愿者选拔


题目大意:中文题不解释。


解题思路:第一次做双端队列的题目,就是维护队列按照从大到小的。然后队列中的每个元素有一个key值,是元素入队的顺序,然后每次加入一个元素的时候,要将队尾所有比该元素小的全部删除,放入该元素。


#include 
  
   
#include 
   
     #include 
    
      using namespace std; const int N = 105; typedef pair
     
       pi; char order[N]; void solve() { int c, cnt = 0, p = 0; deque
      
        que; while (true) { scanf("%s", order); if (strcmp(order, "C") == 0) { scanf("%s %d", order, &c); while ( !que.empty() ) { pi cur = que.back(); if (cur.first >= c) break; que.pop_back(); } que.push_back(make_pair(c, cnt) ); cnt++; } else if (strcmp(order, "Q") == 0) { if (que.empty()) printf("-1\n"); else { pi tmp = que.front(); printf("%d\n", tmp.first); } } else if (strcmp(order, "G") == 0) { if ( !que.empty() ) { pi cur = que.front(); if (cur.second == p) que.pop_front(); p++; } } else if (strcmp(order, "END") == 0) { return; } } } int main () { int cas; scanf("%d", &cas); while (cas--) { solve(); } return 0; }