数据结构-大根堆小根堆模板

明明用优先队列就可以了的说

#include<bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
typedef long long ll;
typedef unsigned long long ull;
const ll MAXN=1e18;
const int MOD=1e6;

struct Maxheap{
    int cnt,date[100050];
    void low(int k){//下沉
        int nex=k*2,tmp=date[k];
        while(nex<=cnt){
            if(nex+1<=cnt&&date[nex+1]>date[nex]) ++nex;
            if(tmp<date[nex]) date[k]=date[nex];
            else break;
            k=nex;nex*=2;
        }
        date[k]=tmp;
    }
    void up(int k){//上浮
        int tmp=date[k];
        while(k>1&&date[k/2]<tmp){
            date[k]=date[k/2];
            k/=2;
        }
        date[k]=tmp;
    }
    void insert(int elem){//插入
        date[++cnt]=elem;
        up(cnt);
    }
    void pop(){//首部删除
        date[0]=date[cnt];
        --cnt;
        low(0);
    }
    void init(){//对date内部元素进行初始化
        if(cnt==1) return;
        int pos;
        for(pos=cnt;pos>=1;--pos){
            if(pos*2<=cnt) break;
        }
        while(pos>=1){
            low(pos);
            --pos;
        }
    }
    void print(){//输出
        for(int i=1;i<=cnt;++i){
            cout<<date[i]<<' ';
        }
        cout<<'\n';
    }
}maxh;

struct Minheap{
    int cnt,date[100050];
    void low(int k){
        int nex=k*2,tmp=date[k];
        while(nex<=cnt){
            if(nex+1<=cnt&&date[nex+1]<date[nex]) ++nex;
            if(tmp>date[nex]) date[k]=date[nex];
            else break;
            k=nex;nex*=2;
        }
        date[k]=tmp;
    }
    void up(int k){
        int tmp=date[k];
        while(k>1&&date[k/2]>tmp){
            date[k]=date[k/2];
            k/=2;
        }
        date[k]=tmp;
    }
    void insert(int elem){
        date[++cnt]=elem;
        up(cnt);
    }
    void pop(){
        date[0]=date[cnt];
        --cnt;
        low(0);
    }
    void init(){
        if(cnt==1) return;
        int pos;
        for(pos=cnt;pos>=1;--pos){
            if(pos*2<=cnt) break;
        }
        while(pos>=1){
            low(pos);
            --pos;
        }
    }
    void print(){
        for(int i=1;i<=cnt;++i){
            cout<<date[i]<<' ';
        }
        cout<<'\n';
    }
}minh;
上一篇:牛客练习赛64 D宝石装箱


下一篇:luogu P4166 [SCOI2007]最大土地面积 凸包 旋转卡壳