维护一个集合,初始时集合为空,支持如下几种操作:
-
I x
,插入一个数$x$ ; -
PM
,输出当前集合中的最小值; -
DM
,删除当前集合中的最小值(数据保证此时的最小值唯一); -
D k
,删除第$k$ 个插入的数; -
C k x
,修改第$k$ 个插入的数,将其变为$x$ ;
现在要进行
第一行包含整数
接下来 I x
, PM
, DM
, D k
或 C k x
中的一种。
对于每个输出指令 PM
,输出一个结果,表示当前集合中的最小值。
每个结果占一行。
数据保证合法。
8
I -10
PM
I -10
D 1
C 2 8
I 6
PM
DM
-10
6
前置题目:0838
前置知识:堆排序
本题知识:数据结构-堆
用数组实现堆,同时支持一些操作
其中和堆排序不同的是需要支持删除第
这样就需要记录第
因此还需要通过在堆中的位置定位到是第几个插入的,同时更新这个值。这样就保证了指针指向的正确性。
// 第 cnt 个插入的数是堆中下标为 size 的值
ph[cnt] = size
// 堆中下标为 size 的值是第 cnt 个被插入的
hp[size] = cnt
核心swap操作
func heapSwap(u, v int) {
swap(&hp[u], &hp[v])
swap(&ph[hp[u]], &ph[hp[v]])
swap(&h[u], &h[v])
}