作业介绍
https://www.luogu.com.cn/training/661703#problems
#include<bits/stdc++.h>
using namespace std;
int n;
int idx; //堆里面有idx个
int h[100005]; //堆
int ph[100005]; //ph[k]=u表示第k个进入的数字在h中的u个位置
int hp[100005]; //hp[u]=k表示结点u是第k个进入的数字
int m; //表示第m个插入的数字
void h_swap(int x, int y){
int k1 = hp[x], k2 = hp[y];
swap(ph[k1], ph[k2]);
swap(hp[x], hp[y]);
swap(h[x], h[y]);
}
void up(int u){
if(u / 2 && h[u / 2] > h[u]){
h_swap(u / 2, u);
up(u / 2);
}
}
int main(){
cin >> n;
while(n--){
string op;
cin >> op;
if(op == "I"){
int x;
cin >> x;
m++;
idx++;
h[idx] = x;
ph[m] = idx; //第m个插入的数字在结点idx
hp[idx] = m; //结点idx是第m个插入的数字
up(idx);
}
else if(op == "PM") cout << h[1] << endl;
else if(op == "DM"){
del(1);
}
else if(op == "D"){
int k;
cin >> k;
int u = ph[k]; //要删除结点u
del(u);
}
else if(op == "C"){
int k, x;
cin >> k >> x;
int u = ph[k];
h[u] = x;
up(u);
down(u);
}
}
return 0;
}
堆:
小根堆:根结点一定最小
大根堆:根结点一定最大
操作:
插入:up操作O(log(n)),
删除最小值:down操作O(log(n))
删除第k个插入的数字:down操作一遍,up操作一遍,O(log(n))
输出最小值:O(1)
堆排序整体时间复杂度:O(n * log(n));
h数组:堆数组
kh:本来输入的第k个数字,存到了h数组中的kh[k]
题目
- 状态
- 已结束
- 题目
- 1
- 开始时间
- 2025-5-24 0:00
- 截止时间
- 2025-5-26 23:59
- 可延期
- 24 小时