priority_queue模板题
You cannot submit for this problem because the contest is ended. You can click "Open in Problem Set" to view this problem in normal mode.
题目描述
现有一个优先队列(Priority Queue)容器,默认遵循大顶堆规则(即每次弹出的元素是当前队列中最大的元素)。支持以下操作:插入元素、弹出元素、查询队顶元素和查询队列大小。你需要实现这个优先队列,并处理可能的边界情况。具体规则如下:
- 插入操作:向优先队列中插入一个元素,插入后需维持大顶堆特性。
- 弹出操作:弹出当前队列中最大的元素(队顶元素)。若队列为空,则操作无效。
- 查询操作:获取当前队列中最大的元素(队顶元素)。若队列为空,则返回特殊值。
- 大小操作:返回优先队列中元素的总数量。
操作完成后,需输出最终队列中剩余元素的个数(若有剩余元素,额外按从大到小的顺序输出所有元素)。
输入格式
- 第一行输入一个整数
q
(1 ≤ q ≤ 1000000
),表示操作的总次数。 - 接下来
q
行,每行表示一次操作,格式如下:- 插入操作:
1 x
(插入元素x
)。 - 弹出操作:
2
(弹出当前最大元素)。 - 查询操作:
3
(查询当前最大元素)。 - 大小操作:
4
(查询队列元素总数)。
- 插入操作:
输出格式
- 对于每次查询操作(操作3),输出一行:
- 若队列非空,输出当前最大元素(队顶元素);
- 若队列为空,输出
-1
。
- 对于每次大小操作(操作4),输出一行整数,表示当前队列的元素数量。
- 所有操作完成后:
- 第一行输出剩余元素的个数;
- 若剩余元素个数大于0,第二行按从大到小的顺序输出所有元素(用空格分隔);若为空,则不输出第二行。
样例 1 输入
7
1 30
1 10
1 20
3
2
3
4
样例 1 输出
30
20
2
2
20 10
样例说明
- 插入操作:依次插入30、10、20,队列按大顶堆特性维持,当前最大元素为30(队列元素:30、10、20)。
- 查询操作:队顶元素为30,输出30。
- 弹出操作:弹出最大元素30,剩余元素需重新维持大顶堆特性(此时最大元素为20,队列元素:20、10)。
- 查询操作:当前最大元素为20,输出20。
- 大小操作:队列剩余2个元素,输出2。
- 最终输出:剩余元素个数为2,按从大到小顺序输出
20 10
。
测试点约束
- 操作次数
q ≤ 1000000
。 - 插入元素
x
的取值范围为int
(-2^31 ~ 2^31-1)。
提示
- 大顶堆特性:核心是确保每次插入或弹出元素后,队列的最大元素始终在队顶(可通过堆的上浮/下沉操作维护)。
- 边界处理:弹出和查询操作前需检查队列是否为空,避免无效操作。
- 高效实现:插入和弹出操作的时间复杂度应为O(log n)(基于堆结构的特性)。
竞赛3班7.26日习题课
- Status
- Done
- Rule
- IOI
- Problem
- 13
- Start at
- 2025-7-26 14:00
- End at
- 2025-7-26 20:00
- Duration
- 6 hour(s)
- Host
- Partic.
- 9