时间: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×1e5;0≤x≤1e9。
样例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×1e5,3号操作可能有很多,所以我们用 优先队列 做,but 优先队列 刚进去整个队内全部变成有序的了,而需要有序的时候实际只有输入3号后,SO我们可以在加入一个 队列 ,优先队列加上队列就能够快速的解决问题。
代码:
#include <bits/stdc++.h>
using namespace std;
priority_queue <int,vector<int>,greater<int> > q;
queue<int> qu;
int n,k;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;i++){
scanf("%d",&k);
if(k==1){
int x;
scanf("%d",&x);
qu.push(x);//加入身高为x的小朋友
}
if(k==2){
if(q.size()!=0){//判断是否为空
printf("%d\n",q.top());//不为空输出优先队列队头(这里只可能是执行3后才不会为空)
q.pop();//删除队头
}
else{
printf("%d\n",qu.front());//若优先队列未用3,或在3后队列没有了,用普通队列完成操作不用优先队列排序
qu.pop();
}
}
if(k==3){
while(qu.size()!=0){
q.push(qu.front());//将数据载入优先队列,排序接着让优先队列操作
qu.pop();//一直到队列全部载入优先队列
}
}
}
return 0;
}