[模板]左偏树

可并堆

可以支持合并的堆.

/*大根堆*/
struct heap{
    int l,r,w,d;
}h[N];
int rt[N];//第i个堆的根的下标 
 
/*合并以x,y为根的堆*/
inline int merge(int x,int y){
    //其中一个堆为空 
    if(!x||!y) return x+y;
     
    //使得x,y两个根中x大 
    if(h[x].w<h[y].w) swap(x,y);
     
    //保持堆两边的平衡 
    h[x].r=merge(y,h[x].r);
    if(h[h[x].l].d<h[h[x].r].d)
        swap(h[x].l,h[x].r);
    h[x].d=h[h[x].r].d+1;
     
    return x;
}
inline int pop(int x){
    int l=h[x].l,r=h[x].r;
    h[x].l=h[x].r=h[x].w=0;
    return merge(l,r);
}
inline int top(x){
    return h[x].w; 
}
posted @ 2017-01-11 17:33  Aireen_Ye  阅读(542)  评论(1编辑  收藏  举报
底部 顶部 留言板 归档 标签
Der Erfolg kommt nicht zu dir, du musst auf den Erfolg zugehen.