Type: Default 2000ms 256MiB

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)容器,默认遵循大顶堆规则(即每次弹出的元素是当前队列中最大的元素)。支持以下操作:插入元素、弹出元素、查询队顶元素和查询队列大小。你需要实现这个优先队列,并处理可能的边界情况。具体规则如下:

  1. 插入操作:向优先队列中插入一个元素,插入后需维持大顶堆特性。
  2. 弹出操作:弹出当前队列中最大的元素(队顶元素)。若队列为空,则操作无效。
  3. 查询操作:获取当前队列中最大的元素(队顶元素)。若队列为空,则返回特殊值。
  4. 大小操作:返回优先队列中元素的总数量。

操作完成后,需输出最终队列中剩余元素的个数(若有剩余元素,额外按从大到小的顺序输出所有元素)。

输入格式

  • 第一行输入一个整数q1 ≤ 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

样例说明

  1. 插入操作:依次插入30、10、20,队列按大顶堆特性维持,当前最大元素为30(队列元素:30、10、20)。
  2. 查询操作:队顶元素为30,输出30。
  3. 弹出操作:弹出最大元素30,剩余元素需重新维持大顶堆特性(此时最大元素为20,队列元素:20、10)。
  4. 查询操作:当前最大元素为20,输出20。
  5. 大小操作:队列剩余2个元素,输出2。
  6. 最终输出:剩余元素个数为2,按从大到小顺序输出20 10

测试点约束

  • 操作次数 q ≤ 1000000
  • 插入元素x的取值范围为int(-2^31 ~ 2^31-1)。

提示

  • 大顶堆特性:核心是确保每次插入或弹出元素后,队列的最大元素始终在队顶(可通过堆的上浮/下沉操作维护)。
  • 边界处理:弹出和查询操作前需检查队列是否为空,避免无效操作。
  • 高效实现:插入和弹出操作的时间复杂度应为O(log n)(基于堆结构的特性)。

竞赛3班7.26日习题课

Not Attended
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