[模板] 左偏树
左偏树的合并(小根堆为例)
模板要刻在 DNA 里
我们需要把根大的接到根小的上面,用一个swap 就可以搞定从而交换根,设当前根为 x ,需要将 y 接到 x 的右子树上去,左子树是不动的,递归过程中维护其左偏的性质。
- merge操作:
int merge(int x,int y){
if(!x||!y)return x|y;
if(v[y]<v[x])swap(x,y);
rs[x]=merge(rs[x],y);
if(dis[ls[x]]<dis[rs[x]])swap(ls[x],rs[x]);
dis[x]=dis[rs[x]]+1;
return x;//返回合并后的根
}
- 删除堆顶操作:
把 x 的左右子树断开(父亲是他自己),然后合并左右儿子即可。
inline void del(int x)
{
rt[ls[x]]=rt[rs[x]]=rt[x]=merge(ls[x],rs[x]);
ls[x]=rs[x]=dis[x]=0;
}
同时可以用并查集来维护。