#include<iostream>
#include<stdio.h>
//heap
using namespace std;
const int heap_size=1e7+5;
int len,a[heap_size];
int top(){
return a[1];//堆顶就是最值
}
void pop(){
a[1]=a[len--];将末尾节点覆盖堆顶,作用是删除
int pos=1,lef,rig;
while(1){
lef=pos*2,rig=pos*2+1;//左右儿子节点编号
if(rig<=len){//如果有右节点
if(a[lef]>a[pos]||a[rig]>a[pos])//根比儿子小,不满足堆的性质
if(a[lef]>a[rig])swap(a[pos],a[lef]),pos=lef;
else swap(a[pos],a[rig]),pos=rig;//找大的替换
else break;//合法退出
}
else {
if(lef<=len)//如果只有左儿子
if(a[lef]>a[pos])
swap(a[pos],a[lef]),pos=lef;
else break;//同理
}
if(lef>len)break;//到末尾退出
}
}
void push(int x){
a[++len]=x;//末尾插入
int pos=len,fa;
while(a[pos/2]<a[pos]&&pos!=1){//不断往上找,看根节点是否小于儿子节点,不断交换直到堆顶
fa=pos/2;//父亲点
swap(a[fa],a[pos]);//换
pos=fa;更新新节点位置
}
}
int n;
int main(){
scanf("%d",&n);
while(n--){
int op,x;
scanf("%d",&op);
if(op==1)scanf("%d",&x),push(-x);
if(op==2)printf("%d\n",-top());
if(op==3)pop();
}
return 0;
}
二叉堆,...
最新推荐文章于 2024-10-02 10:07:45 发布