xjoi题解:P7782 排队
时间:1s 空间:256M
题目描述:
幼儿园里的小朋友在玩排队游戏,他们会根据老师的要求排队。
老师共进行 n 次操作,操作分为以下三种:
1 x : 将一名身高为 x 的小朋友加入队尾
2 : 输出队列最前面的小朋友的身高,保证进行该操作时队列非空
3 : 将队列里的小朋友按照身高升序排序
输入格式:
第一行,包含一个正整数 n,表示操作次数。
加下来n行按照以下格式之一输入操作:
1 x
2
3
输出格式:
对应操作进行输出。
样例1输入:
9
1 1
1 3
1 2
3
2
2
1 0
3
2
样例1输出:
1
2
0
约定与解释:
对于100%的数据,1≤n≤2×105;0≤x≤109。
样例1解释:
第1个操作后,队列为 [1];
第2个操作后,队列为 [1,3];
第3个操作后,队列为 [1,3,2];
第4个操作后,队列为 [1,2,3];
第5个操作后,队列为 [2,3];
第6个操作后,队列为 [3];
第7个操作后,队列为 [3,0];
第8个操作后,队列为 [0,3];
第9个操作后,队列为 [3]。
分析:
这是一道数据结构题。因为1≤n≤2×105,所以我们只能用优先队列+队列去做(怕3号操作太多),但优先队列插入进去就直接变得有序了,题意是说只有在3号操作时才变得有序,所以说它不要求随时都是有序的,但在3号操作后必须变得有序了。所以我们用优先队列+队列来进行优化,从而实现对大规模数据的运算。
代码:
#include <bits/stdc++.h>
using namespace std;
priority_queue <int,vector<int>, greater<int>> Queue;
queue<int> QuEue;
int main() {
int n;
scanf("%d", &n);
while (n--) {
int op;
scanf("%d", &op);
if (op == 1) {
int x;
scanf("%d", &x);
QuEue.push(x);
}
if (op == 2) {
if (!Queue.empty()) {
printf("%d\n", Queue.top());
Queue.pop();
} else {
printf("%d\n", QuEue.front());
QuEue.pop();
}
}
if (op == 3) {
while (!QuEue.empty()) {
Queue.push(QuEue.front());
QuEue.pop();
}
}
}
return 0;
}