树分治

点分治

可以处理大规模树上路径信息问题。

每次选择一个节点作为根节点\(rt\),树上路径要么经过\(rt\)要么不经过\(rt\)。先处理\(rt\)作为链的一端,子树中的点作为另一端的链的贡献,那么经过\(rt\)的路径的信息可以通过这样的链合并得到。

然后对于每个子树递归下去处理。递归下去之前要清空当前这层对答案数组的影响,这需要记录撤销哪些操作,而不能暴力清空。

每次递归以重心作为根最优,因为子树大小减半,是\(O(n\log n)\)的。可能因为算贡献的复杂度还要乘上一坨。

重选根节点后要重新计算子树大小,否则会出锅。

边分治

和点分治是类似的,每次选一条边将树分为大小尽量相等的两部分。

但是菊花图可以卡这个,于是要将原树转二叉树。

一种类似线段树,对点\(x\),若儿子个数不超过二,就直接连,否则新建两个点,将\(x\)的儿子分成两半扔给这两个新点,并且将虚点向\(x\)连边。空间复杂度\(O(n\log n)\)

一种是用一个\(lst\)记录\(x\),要连一个儿子时,将\(lst\)向其连边,然后新建一个点\(y\),再将\(lst\)\(y\)连边并\(lst\gets y\)。空间复杂度\(O(n)\)

点分树

又称动态点分治。

对原树进行重构保证树高稳定\(\log n\),可解决与原树形态无关的待修改问题。

用点分治找分治中心的方式重构,将每一层的分治中心与上一层的分治中心连边。

有一点性质:

  1. 两点在点分树上的LCA一定在原树上两点间的路径上。

  2. 原树上的一个连通块一定在点分树上以这个连通块中的点为根的一个子树内。

链分治

进行链剖分,然后将询问拆到链上,再对每条链进行处理。

处理过程形如每次抽出一条链,处理这条链的询问,然后对于这条链上挂的子树分治下去。

一个例题是 Border 的四种求法。

posted @ 2025-06-14 16:40  RandomShuffle  阅读(16)  评论(0)    收藏  举报