构造大顶堆:
int heap[maxn],sz=0//初始为空
void up(p) {
while(p>1) {
if(heap[p]>heap[p/2]);
swap(head[p],head[p/2]);
p/=2;
else break;//最大值不断向上
}
}
void lowin(int val) {
heap[++sz]=val;
up(sz);
}//堆底插入
void down(p):{
int s=p*2;
while(s<=sz) {
if(s+1<=sz&&heap[s]>heap[s+1])
s++;//选择左右儿子当中的较小者
if(heap[s]<heap[p]) {
swap(heap[s],heap[p]);
p=s;
s=p*2;
}
else break;
}
}//向下更新
void highin(int val){
heap[1]=val;
down(1);
}//堆顶插入
void del(int val){
int p=1;
while(heap[p]!=val&&p<=sz)
p++;
swap(heap[p],heap[sz]);//交换到堆底
sz--;//size减小
down(p);//向下更新
}//删除指定元素
int top(){
return heap[1]
}//获得堆顶
bro(p){
fa=p/2;
if(fa*2==p) return fa*2+1;
else return fa*2;
}//求兄弟的函数
STL当中priority_queue默认是大顶堆,传入greater<>之后是小顶堆。