堆模板…没什么好讲的…
如题,初始小根堆为空,我们需要支持以下3种操作:
操作1: 1 x 表示将x插入到堆中
操作2: 2 输出该小根堆内的最小数
操作3: 3 删除该小根堆内的最小数
操作一即是插入元素
操作二三其实就是取出元素的分解,将查找+取出分为了查找操作和删除操作…
直接上代码吧…真没啥说的了【水】
代码:
#include <bits/stdc++.h>
using namespace std;
int d[1000001];
int high = 0;
void xs(int mw) {
int i = mw;
int j = mw / 2;
while (j >= 1) {
if (d[j] > d[i]) {
swap(d[j] , d[i]);
i = j;
j = i / 2;
} else {
break;
}
}
}
void xx(int mw) {
int i = 1;
int j = i * 2;
while (j <= high) {
if (j + 1 <= high && d[j + 1] < d[j]) {
j = j + 1;
}
if (d[j] < d[i]) {
swap(d[i] , d[j]);
i = j;
j = i * 2;
} else {
break;
}
}
}
int main() {
int N , cz , czs;
cin >> N;
for (int i = 1;i <= N;i++) {
cin >> cz;
if (cz == 1) {
cin >> czs;
high++;
d[high] = czs;
xs(high);
/*
if (czs < d[1]) {
swap(czs , d[1]);
}
d[high] = czs;
*/
} else if (cz == 2) {
cout << d[1] << endl;
} else {
d[1] = d[high];
high--;
xx(high);
}
}
return 0;
}
完结…撒花…