· · 个人记录

概述

简单堆(二叉堆)

左偏树

6.示范代码

namespace leftist_tree{
    struct node{
        int d,ls,rs;//这是左偏树本身的结构信息 
        ll v;
        node(){}
        node(ll _v){d=1,v=_v;}
    }a[maxn];
    int rt[maxn],tot,tsh[maxn],tstp;
    il int newnode(ll v){
        if(tstp) return a[tsh[tstp]]=node(v),tsh[tstp--];
        return a[++tot]=node(v),tot;
    }
    il void pu(int now){
        if(a[a[now].ls].d<a[a[now].rs].d) swap(a[now].ls,a[now].rs);
        a[now].d=a[a[now].rs].d+1;
        return;
    }
    il int merge(int now1,int now2){
        if(!now1 || !now2) return now1|now2;
        if(a[now1].v>a[now2].v) swap(now1,now2);
        a[now1].rs=merge(a[now1].rs,now2);
        pu(now1); return now1;
    }
    il int ins(int now1,int now2){return merge(now1,now2);}
    il int pop(int now){
        tsh[++tstp]=now;
        return merge(a[now].ls,a[now].rs);
    }
}