对顶堆

对顶堆

题目

题目描述
小明和小宝正在玩一个简单的数字游戏。小明可以选择写下一个数字,也可以问小宝第个大数是多少。因为小明写的数字太多,小宝感到头晕目眩。现在,试着帮助小宝。

现在,试着帮助小宝。

简单描述:给你一些数字,然后问第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

posted @ 2023-07-23 21:28  骆美辰  阅读(38)  评论(0编辑  收藏  举报
lock: { enable: true, background: 'https://img1.baidu.com/it/u=2788089125,168843488&fm=253&app=138&size=w931&n=0&f=JPEG&fmt=auto?sec=1690563600&t=35fa4326e773b3fbf83562ad746b7cd2',//锁屏背景 strings: [ 'Every win named never give up 每一份胜利都叫不放弃',//签名 ], },