详解二叉堆(prioity_queue)

二叉堆(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中插入一个元素
}

既然学会了常见用法,那就来做做例题吧。

例题:二叉堆

题目描述

给定一个数列,初始为空,请支持下面三种操作:

  1. 给定一个整数 x x x,请将 x x x加入到数列中。
  2. 输出数列中最小的数。
  3. 删除数列中最小的数(如果有多个数最小,只删除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 n15

  • 对于 70 70% 70的数据,保证 n ≤ 1 0 4 n \leq 10^4 n104

  • 对于 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 n1061x<2311op3

输出

对于每个 o p op op 2 2 2的操作,输出一行一个整数表示答案。

样例输入

5
1 2
1 5
2
3
2

样例输出

2
5
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值