这个堆是边插入边操作的 和全部给出那种变成堆是有区别的
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+10;
int head[N];
int sz;
void push(int x)
{
head[++sz]=x;//先插入到最新叶节点
int now=sz;
while(now){
int fa=now>>1;
if(head[fa]>head[now]) swap(head[fa],head[now]);
else break;
now=fa;
}
}
void pop()
{
swap(head[sz],head[1]);//把第一个放在最后一个叶节点
sz--;//删除叶节点
int now=1;
while((now<<1)<=sz){
int fa=now<<1;
if(fa+1<=sz&&head[fa+1]<head[fa]) fa++;
if(head[fa]<head[now]) swap(head[fa],head[now]);
else break;
now=fa;
}
}
int main()
{
int n;scanf("%d",&n);
for(int i=0;i<n;i++){
int id;
scanf("%d",&id);
if(id==1){
int x;
scanf("%d",&x);
push(x);
}
else if(id==2) printf("%d\n",head[1]);
else pop();
}
return 0;
}
或者用:priority_queue<int,vector<int>,greater<int> >q;