二叉堆(prioity_queue)
洛谷上有例题(一毛一样)!
例题传送门
题目数据暂时有错误,前三个点对了大概率就AC了。(附件以名为"wangjy_1"的测试点至名为“wangjy_3”的测试点可用)
平均情况下常用操作及其时间复杂度:
- 插入一个元素 | O(log2(n))
- 提取一个元素(最小值) | O(1)
- 删除最小值 | O(log2(n))
使用方法:
#include <queue> //队列头文件
priority_queue<int> que; // 定义一个名叫“que”的大根堆(从大到小排序)
priority_queue<int, vector<int>, greater<int> > que; //定义一个名叫“que”的小根堆(从小到大排序)
// 常见函数:
que.pop(); //删除最小/大值
cout << que.top(); //输出que中的最大/小值
{
int x;
cin >> x;
que.push(x); //向que中插入一个元素
}
既然学会了常见用法,那就来做做例题吧。
例题:二叉堆
题目描述
给定一个数列,初始为空,请支持下面三种操作:
- 给定一个整数 x x x,请将 x x x加入到数列中。
- 输出数列中最小的数。
- 删除数列中最小的数(如果有多个数最小,只删除1个)。
输入
第一行是一个整数,表示操作的次数
n
n
n。
接下来
n
n
n行,每行表示一次操作。每行首先有一个整数
o
p
op
op表示操作类型。
-
若 o p = 1 op = 1 op=1,则后面有一个整数 x x x,表示要将 x x x加入数列。
-
若 o p = 2 op = 2 op=2,则表示要求输出数列中最小的数。
-
若 o p = 3 op = 3 op=3,则表示删除数列中的最小数。如有多个数最小,只删除 1 1 1个。
-
对于 30 30% 30的数据,保证 n ≤ 15 n \leq 15 n≤15。
-
对于 70 70% 70的数据,保证 n ≤ 1 0 4 n \leq 10^4 n≤104。
-
对于 30 30% 30的数据,保证 n ≤ 1 0 6 , 1 ≤ x < 2 3 1 , 1 ≤ o p ≤ 3 n \leq 10^6,1\leq x < 2^31,1 \leq op \leq 3 n≤106,1≤x<231,1≤op≤3。
输出
对于每个 o p op op为 2 2 2的操作,输出一行一个整数表示答案。
样例输入
5
1 2
1 5
2
3
2
样例输出
2
5