#HX3793. 优先队列题七:堆操作

提交1 通过1
通过率100%
时间限制1000ms
内存限制128MiB

题目描述

题目描述

Petya 最近在学习数据结构。他正在练习最小堆,Petya 对他的堆进行若干操作,并且记录下了每次操作的结果,包括以下三种:

(1)insert x:将一个值为 xx 的数加入堆中。

(2)removeMin:删除堆中的最小数。

(3)getMin x:查询堆中的数的最小值,发现堆中数的最小值等于 xx

做好记录后,Vova 来到 Petya 的房间,把 Petya 的记录弄丢了一部分。于是 Vova 决定在剩下的记录中添加一些记录,让记录不出现矛盾。

(1)insert x,直接将一个值为 xx 的数加入堆中即可,不会出现矛盾。

(2)遇到 removeMin 时,如果堆中还有数,那么直接删除最小数即可。如果堆中没有数,就会出现矛盾,此时 Vova 会在 removeMin 前添加一条 insert 0,先将数 0 加入堆中,再进行删除操作。

(3)遇到 getMin x 时,分 3 种情况:

(i)堆中最小数等于 xx,此时不会出现矛盾。

(ii)堆中没有数,或者堆中最小数大于 xx,此时 Vova 会先添加一条 insert x 操作,这样堆中的最小数就是 xx 了。

(iii)堆中最小数小于 xx,此时 Vova 会添加若干条 removeMin 操作,直到堆中的最小数大于等于 xx 或者堆中没有数为止。这样就化为(i)或(ii)的情况了。

输入 Petya 剩下的记录,输出 Vova 添加记录后,记录的条数以及完整记录。

输入描述

第 1 行,1 个正整数 nn,表示剩下的记录个数。

接下来 nn 行,每行是一条记录。如果是 insertgetMin 记录,后面会跟着一个整数 xx

输出描述

第 1 行,输出一个正整数 mm,表示 Vova 添加记录后,记录的条数。

接下来 mm 行,每行一条记录,表示 Vova 添加后的完整记录,格式同输入。

样例 1

3
removeMin
getMin 4
getMin 5
7
insert 0
removeMin
insert 4
getMin 4
removeMin
insert 5
getMin 5

样例 2(原图存在笔误,见后面的校勘说明)

以下保留原图输入、输出,便于核对原题。

4
insert 1
insert 1
insert 1
getMin 2
7
insert 1
insert 1
insert 4
removeMin
removeMin
insert 2
getMin 2

说明提示(原文)

样例 1 说明:

第 1 条记录是 removeMin,但是此时堆中没有数,所以先添加一条 insert 0

第 2 条记录是 getMin 4,但是此时堆中没有数,所以先添加一条 insert 4

第 3 条记录是 getMin 5,但是此时堆中数的最小值是 4,所以要先进行 removeMin 直到堆中没有数,再添加一条 insert 5

样例 2 说明:

前 3 条都不会出现矛盾。

第 4 条记录是 getMin 2,此时堆中数是 [1,1,4],添加 2 条 removeMin 之后,堆中最小数变成 4,再添加一条 insert 2,最小数就是 2 了。

数据范围

1n1051\le n\le10^5

109x109-10^9\le x\le10^9

原题样例校勘说明

原图样例 2 的输入第三条是 insert 1,但输出第三条及说明使用的是 insert 4,两处不一致。上面保留原文,不将该笔误当作判题规则。

若按原图输入的三条 insert 1 执行,依题目规定应先删除三个 1,再插入 2,正确结果为以下 8 条记录:

8
insert 1
insert 1
insert 1
removeMin
removeMin
removeMin
insert 2
getMin 2

如果将输入第三条改为 insert 4,原图给出的 7 条输出和说明才相符。,现有测试数据不采用这组错误配对。