二叉堆与合并

浅谈二叉堆合并

参考文献

我们先来看一道例题

P7840

给定每个点的点权 \(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\) 为较大常数

posted @ 2023-04-11 21:14  xyzfrozen  阅读(60)  评论(0)    收藏  举报