[模板]左偏树

可并堆

可以支持合并的堆.

/大根堆/
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  阅读(567)  评论(1)    收藏  举报
底部 顶部 留言板 归档 标签
Der Erfolg kommt nicht zu dir, du musst auf den Erfolg zugehen.