首先了解优先队列:
可以理解优先队列就是一个含有内部排序的队列,具有队列的一切属性,本质上是通过堆来实现的。
定义语法:
priority_queue<Type, Container, Functional>
Type 是数据类型 (注意:数据元素的类型可以是pair类型)
Container 由数组实现的一些数据结构,如:vector,deque,不可以是List类型,就是存放元素的容器
Functional 是内部排序的方式
当使用的数据类型是基本的内置的数据类型的时候就可以直接传入类型来创建优先队列,默认是大根堆(降序序列)
小根堆 升序序列
priority_queue <int,vector,greater > q;
小根堆 降序序列
priority_queue <int,vector,less > q;
第 K 小问题:
题目:第K小问题题目
思路:
维护一个元素数量上限为K的一个优先队列,按照大根堆的形式进行排序,队列的首元素就是第K小的元素,如果当前元素的数量小于K就不断向其中加入元素,否则,判断当前的队列头部元素与待加入的元素的大小,如果小于对头元素,就直接将当前的对头元素出队,再入队当前的待加入即可。
代码:
#include <set>
#include <map>
#include <queue>
#include <stack>
#include <string>
#include <cstring>
#include <iostream>
#include <algorithm>
#define FAST ios::sync_with_stdio(false)
#define LL long long
#pragma GCC optimize(2)
using namespace std;
int n,m,k;
int main(void)
{
FAST;
cin >> n >> m >> k;
priority_queue<int> q;
for(int i = 0;i < n;i++) // 输入n个数据的时候就开始维护长度为k的优先队列
{
int x;
cin >> x;
if(q.size() < k) q.push(x);
else
{
if(x < q.top()) q.pop(),q.push(x);
}
}
for(int i = 0;i < m;i++)
{
int t;
cin >> t;
if(t == 1)
{
int x;
cin >> x;
if(q.size() < k) q.push(x); // 插入元素
else
{
if(x < q.top()) q.pop(),q.push(x);
}
}
else if(t == 2) //询问元素
{
if(q.size() >= k)
cout << q.top() << endl;
else
cout << -1 << endl;
}
}
return 0;
}