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

来源:互联网 发布:cad画图软件 编辑:程序博客网 时间:2024/06/04 19:40

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


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


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


#include <stdio.h>#include <string.h>#include <queue>using namespace std;const int N = 105;typedef pair<int, int> pi;char order[N];void solve() {int c, cnt = 0, p = 0;deque<pi> 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;}


原创粉丝点击