[模板] 左偏树

左偏树的合并(小根堆为例)

模板要刻在 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;
}

同时可以用并查集来维护。

posted @ 2021-08-12 16:33  ¶凉笙  阅读(29)  评论(0编辑  收藏  举报