二叉堆与合并
浅谈二叉堆合并
我们先来看一道例题
给定每个点的点权 \(v_i\),求一棵树,设每个点度数为 \(d_i\)
最小化 \(\Sigma d_i^2v_i\)
初始每个点都不连通,我们要做的就是把 \(n\) 个连通块合并成 \(1\) 个,不妨考虑加入一条边 \((u,v)\) 的贡献
\(val=((d_u+1)^2-d_u^2) \times v_u + ((d_v+1)^2-d_v^2) \times v_v\)
不妨贪心,设全集 \(S\) 则问题转化为,求 \(S\) 中不联通的两点,其 \(((d_i+1)^2-d_i^2) \times v_i\) 分别为最小值和次小值
启发式合并
原理:每次将较小的堆的点全部加入较大堆,平摊复杂度 \(O(log^2n)\)
本题如何用启发式合并?
设堆的集合为 \(T\) ,则分别维护每个连通块内部最小值,再用一个堆维护最小值的最小值即可
合并 \(n-1\) 次,复杂度为 \(O(nlog^n)\)
左偏树/斜树
咕咕咕 \(O(logn)\)
随机堆
不妨类似平衡树的模式,随机合并
合并两个根的时候,没有儿子先向空方向合并,否则随机左儿子右儿子合并
那么这个复杂度级别应该是和 \(fhq\) 差不多的
\(O(wlogn)\),\(w\) 为较大常数