对顶堆
对顶堆
题目
题目描述
小明和小宝正在玩一个简单的数字游戏。小明可以选择写下一个数字,也可以问小宝第个大数是多少。因为小明写的数字太多,小宝感到头晕目眩。现在,试着帮助小宝。
现在,试着帮助小宝。
简单描述:给你一些数字,然后问第k大的数字是谁,中间会有一些新的数字加进来。
输入。
第一行输入包含两个正整数,,代表次操作,代表第大。
然后是行。如果肖明选择写一个,后面会跟着一个数字。如果肖明选择问小宝,会有一个,那么你需要输出第个大数。
输出。
输出第大的数。
样例输入
8 3
I 1
I 2
I 3
Q
I 5
Q
I 4
Q
样例输出
1
2
3
提示
当书写的数字小于k时,肖明不会问小宝第k个大数。
思路
这是明显的第k大问题,我们需要用到对顶堆
我们建一个大根堆,一个小根堆
其中一个限制它大小为k,如果一个数据大于(小于)这个堆的顶,那么存入,否则存入另一个堆
这样最后限制大小的堆的堆顶就是最终答案
代码
代码中有用的STL,[不懂得朋友看这儿](https://www.cnblogs.com/L-1115/p/17575933.html)
#include<bits/stdc++.h>
using namespace std;
priority_queue<int>q2;//大根堆
priority_queue<int,vector<int>,greater<int> >q1;//小根堆
int n,k;
int main() {
cin >> n >> k;
char x;
for(int i = 1;i <= k;i ++){
cin >> x;
int a;
cin >> a;
q1.push(a);
}
for(int i = k + 1;i <= n;i ++){
cin >> x;
if(x == 'I'){
int y;
cin >> y;
if(y > q1.top()) {
q1.pop();
q1.push(y);
}else{
q2.push(y);
}
}
if(x == 'Q'){
cout << q1.top() << endl;
}
}
return 0;
}
小编蒟蒻一个,有什么问题请大佬不惜赐教Orz