原题链接:
题解:
由于需要考虑插入顺序,所以本题比较恶心
代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1e5 + 10;
int h[N], s, ph[N], hp[N];
//ph数组记录的是按照插入顺序的结点下标
//hp数组记录的是结点下标对应的插入顺序
//两者之间是相互映射关系
void heap_swap(int a,int b) {
swap(ph[hp[a]], ph[hp[b]]);
swap(hp[a], hp[b]);
swap(h[a], h[b]);
}
void down(int x) {
int t = x;
if (2 * x <= s && h[2 * x] < h[x]) t = 2 * x;
if (2 * x + 1 <= s && h[2 * x + 1] < h[t]) t = 2 * x + 1;
if (t != x) {
heap_swap(t, x);
down(t);
}
}
void up(int x) {
while (x / 2 && h[x / 2] > h[x]) {
heap_swap(x, x / 2);
x /= 2;
}
}
int main() {
int N;cin >> N;
int m = 0;//记录插入顺序,从1开始
while (N--) {
string op;cin >> op;
int x, k;
if (op == "I") {
cin >> x;
s++;
m++;
ph[m] = s;
hp[s] = m;
h[s] = x;
up(s);
}
else if (op == "PM") {
cout << h[1] << endl;
}
else if (op == "DM") {
heap_swap(1, s);
s--;
down(1);
}
else if (op == "D") {
cin >> k;
k = ph[k];//必须存储一下,后边会发生变化
heap_swap(k, s);
s--;
down(k), up(k);
}
else {
cin >> k >> x;
k = ph[k];
h[k] = x;
down(k), up(k);
}
}
}