CF681C Heap Operations
题目描述
题目:堆的操作
题面:
Petya近日学习了一种名为"二元堆"的数据结构。
这个数据结构支持以下操作:
-将给定的数字放入堆中;
-取得堆中最小的元素的值;
-取出(去除)堆中最小的元素;
于是,这个堆在任何时候都包含数个整数(可能是一个),它们当中有一些是相等的。
为了更好地学习这个数据结构,Petya创立了一个空的堆并在上面应用了一些操作。同时,他小心翼翼地在他的日志中写下了所有的操作,如下:
insert x — 将一个值为x的元素插入堆中;
getMin x — 这个时候,堆中最小的元素的值为x.
removeMin — 移除堆中最小的元素(若有多个相同,只移除其中的一个).
所有的操作都是不矛盾的。换句话说,当应用 getMin 或者 removeMin 操作的时候,堆中有至少一个元素。
当Petya去吃午饭的时候,他的弟弟Vova进入了他的房间,拿走了Petya日志中的数页来做纸船。
现在Vova非常地焦虑,因为他可能已经让Petya的一系列操作变得前后矛盾。例如,如果一个一个地执行日志上所写着的操作,getMin操作所取得的结果可能与Petya记录的结果不同,而且如果这个时候堆是空的,那么 getMin 和 removeMin 操作将会产生错误。
Vova希望在日志中添加一些新的操作来让各项操作的结果正确。也就是说,每个 getMin 操作所得到的结果必须与日志中记录的相吻合,且不会出现操作前后矛盾或者导致错误。Vova想尽可能快地完成这些,因为Petya很快就会回来。现在Vova想要你在日志中添加尽可能少的操作纪录,这些记录可以被添加在日志的任何位置。
输入格式
第一行一个整数n (1
输出格式
输出的第一行应该输出一个单独的整数m,代表最小的更改后的日志文件包含的操作数量。
接下来m行输出更改后的正确日志,按顺序地每一行输出操作名称和参数或者得到的结果,所有输出的数字都应该是整数而且绝对值不大于10^9.
保证最后正确的操作序列日志中所包含的操作数量不大于1000000.
感谢@Mickey_snow 提供的翻译
说明/提示
In the first sample, after number $ 3 $ is inserted into the heap, the minimum number is $ 3 $ . To make the result of the first getMin equal to $ 4 $ one should firstly remove number $ 3 $ from the heap and then add number $ 4 $ into the heap.
In the second sample case number $ 1 $ is inserted two times, so should be similarly removed twice.