【学习笔记】边分治
算法思想
和点分治类似,边分治每次选一条边,考虑跨过这条边的路径贡献,为了保证复杂度,会让两边子树大小尽量接近。
发现菊花图无论怎么分治都是无效的,考虑将原树三度化,具体做法是如果 \(u\) 有两个儿子,就新建一个节点连接第二个儿子,如果还有更多的儿子,就再新建节点与上一次新建的节点当前的儿子相连,这样复杂度是正确的。
具体过程和点分治类似:求当前的子树大小,求当前的重心边,递归处理子问题。
边分治具有优美的性质:每次分治只会考虑两棵子树之间的贡献,也就完全不需要点分治中容斥掉自己贡献的操作。缺点是点数翻倍。
例题
Luogu-P4565 CTSC 2018 暴力写挂
在边分治过程中,某两个子树的 \(\mathrm{LCA}\) 一定之和分治中心父亲一侧子树的节点有关,所以式子可以写成形如 \(val_u+val_v-\mathrm{depth'}(\mathrm{LCA}'(u,v))\)。将分治边两侧子树视作黑白两种颜色,那么就是在第二棵树上求异色点权最大值,具体可以建虚树,枚举 \(\mathrm{LCA}'(u,v)\)。
Luogu-P4220 WC 2018 通道
依旧是第一棵树边分治,第二棵树建虚树,现在每个节点有点权,固定了第二棵树的 \(\mathrm{LCA}\),剩下可以看作对第三棵树求一个带端点点权的有权直径,由于边权非负,容易证明这满足所有的直径性质,那么对虚树每个子树维护然后合并就行了,实际上要维护两条同色直径,合并时求一下异色直径。(只维护一条异色直径可能出现端点不是所有同色节点的最长距离对于端点的情况)