树分治

% command_block

静态链分治之前写过,不赘述。

重心

此处定义为到所有节点(带权)距离和最小的结点。

我们用 向重心移动 的方法可以证明其性质。假定权值均为正数:

  1. 重心不唯一,至多有两个且一定相邻。

  2. 边权与带权重心的确定无关。

  3. 以重心为根,所有儿子子树权值和不超过 \(\dfrac{\sum v_i}{2}\)

  4. 以任意点为根,重心的子树权值和不小于 \(\dfrac{\sum v_i}{2}\)

Lemma 1:DFS 序上处于中点位置的结点一定在重心子树内。

Lemma 2:这个结点的最深的子树权值和不小于 \(\dfrac{\sum v_i}{2}\) 的祖先是重心。据此可以动态计算重心。

  1. 一条边连接两棵树形成的树的重心在连接原来两个重心的路径上。

  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 或数据结构就要加上不同色的条件。所以显然边分治常用,因为只有两种颜色。

采用边分树的话有一些科技。

分治树

点分树

  1. 树高 \(O(logn)\)
  2. 点分树上 \(lca(x,y)\)\(x,y\) 公共祖先中唯一位于原树中路径 \((x,y)\) 上的点。

边分树

类比重构树建立

  1. 树高 \(O(logn)\)
  2. 点分树上 \(lca(x,y)\)\(x,y\) 公共祖先中唯一位于原树中路径 \((x,y)\) 上的边。
  3. 类似重构树地,一定为二叉树。

Some Facts:猫树可视为序列上的点分树。此结论可能有助于联想(?)

posted @ 2023-07-24 22:39  音街ウナ  阅读(19)  评论(0)    收藏  举报