题目链接: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; }