左偏树总结
左偏树总结
左偏树
一种合并复杂度为\(O(log_2^n)\)的可并堆
具有左偏性质,左子树距离大于右子树距离,即\(dis[ls]\ge dis[rs]\)(这里一个点的距离定义为子树中离他最近的外节点到这个节点的距离,其实不需要纠结这个)
我们合并时每次将当前节点的右儿子和另一个堆的堆顶合并。
Merge合并堆操作:
int merge(int a, int b){
if(a==0||b==0) return a+b; // 返回非空编号
if(val[a]<val[b]) swap(a,b); // 大根堆
sr[a]=merge(sr[a], b); // 合并
if(dis[sl[a]]<dis[sr[a]]) swap(sl[a], sr[a]); // 保证左偏
dis[a]=dis[sr[a]]+1; // 更新dis
return a;
}