树分治
% command_block
静态链分治之前写过,不赘述。
重心
此处定义为到所有节点(带权)距离和最小的结点。
我们用 向重心移动 的方法可以证明其性质。假定权值均为正数:
-
重心不唯一,至多有两个且一定相邻。
-
边权与带权重心的确定无关。
-
以重心为根,所有儿子子树权值和不超过 \(\dfrac{\sum v_i}{2}\)。
-
以任意点为根,重心的子树权值和不小于 \(\dfrac{\sum v_i}{2}\)。
Lemma 1:DFS 序上处于中点位置的结点一定在重心子树内。
Lemma 2:这个结点的最深的子树权值和不小于 \(\dfrac{\sum v_i}{2}\) 的祖先是重心。据此可以动态计算重心。
-
一条边连接两棵树形成的树的重心在连接原来两个重心的路径上。
-
在一棵树上添加或删除一个叶子,那么它的重心最多只移动一条边的距离。
按重心移动
考虑各种 权值非负 的广义重心。如:
求一个点 \(x\) 使得 \(\displaystyle \max_{u,v\in V}{dis(u,x)+dis(v,x)}\) 最小。
一种想法是若随便钦定一个点作为根,考虑能否向儿子子树移动使得答案更优。显然当且仅当当前取到最大值的各对 \((u,v)\) 全部位于某个儿子子树中。
于是考虑类比点分治,每次取某个子树的重心递归处理,并遍历求最大点对。相当于每个儿子子树的直径加上儿子到根边长度的两倍。时间复杂度 \(O(n\log n)\)。
[CF566C] Logistical Questions:求一个点 \(x\) 使得 \(\displaystyle \sum_{u\in V}{a_u\cdot dis^{\frac{3}{2}}(u,x)}\) 最小。
另一种广义重心,更接近于一般带权重心。首先冷静思考:带权重心 有定义的情况,本质上是:
固定 \(u\),对于一条路径上依次各点 \(x\),\(w(u,x)\) 是关于 \(x\) 的 凸函数,所以 \(\sum_{u\in V}w(u,x)\) 是关于 \(x\) 的凸函数。
此题中 \(w(u,x)=dis^{\frac{3}{2}}(u,x)\)。
求导
考虑若树退化为链,显然可以用 求导 + 二分 解决这个凸函数求极值点的问题。
同理考虑树上情况。目前根为 \(x\),如何判断向哪个儿子子树移动。发现若对每个儿子子树内部的 \(u\),对 \(w'(u, x)\) 求和就可以得到向这个方向移动 \(\mathrm{d}x\) 的贡献,设和为 \(p_i\)。
对所有儿子 \(i\),若 \(2p_i-\sum p>0\),就可以向这个儿子移动。这样的儿子不超过一个。
边分治
三度化 / 转二叉树
考虑菊花图边分治无法保证复杂度。尝试增加无权值的虚点及虚边让所有点度数不超过 \(3\),且 任意两点路径经过的实点 / 实边集前后相同。
实现可以直接左儿子右兄弟。左边为实边,右边(若存在)为虚边。
用途
考虑边分治 只会产生两棵而不是多棵子树 的性质是很好的。例如以下问题:
树上点有权值 \((a_i,b_i)\),给定 \(L,R\) 要求一条路径使得 \(\sum a_i\in[L, R]\) 的基础上最大化 \(\bigoplus b_i\)。
考虑若进行点分治,那么我们必须将所有点 按照 \(a\) 排序插入可持久化 01Trie,然后值域区间上查询。
但是这样的结构是 静态 不能动态插入,而且最大值问题不能容斥。一种好的解决方案是改用边分治。这样只有两个子树只需要在一个上建立结构,遍历另一个查询。
Bonus:仍用点分治,每次提取最小的两个子树统计贡献,并 \(O(siz_x+siz_y)\) 暴力重构其结构,复杂度仍为 \(O(n\log n)\)。证明并不显然,一种想法是合并过程构成哈夫曼树,考虑计算其带权路径长度和。
多树问题
基本套路:外层树分治 / 分治树 / 虚树 DP,内层树剖 / DFS 等暴力维护。有毒瘤题套三层。
若采用树分治,则需要对各子树分别染色,并且一般贡献要能够拆到结点上。那么 DP 或数据结构就要加上不同色的条件。所以显然边分治常用,因为只有两种颜色。
采用边分树的话有一些科技。
分治树
点分树
- 树高 \(O(logn)\)。
- 点分树上 \(lca(x,y)\) 是 \(x,y\) 公共祖先中唯一位于原树中路径 \((x,y)\) 上的点。
边分树
类比重构树建立
- 树高 \(O(logn)\)。
- 点分树上 \(lca(x,y)\) 是 \(x,y\) 公共祖先中唯一位于原树中路径 \((x,y)\) 上的边。
- 类似重构树地,一定为二叉树。
Some Facts:猫树可视为序列上的点分树。此结论可能有助于联想(?)

浙公网安备 33010602011771号