written by oneman233
2019-08-19

构造大顶堆:

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<>之后是小顶堆。