动态树分治
动态点分治
动态点分治用来解决 带点权/边权修改 的树上路径信息统计问题。
点分树
回顾点分治的计算过程。
对于一个结点
对于一个子树中简单路径的计算,我们选择一个分治中心
可以证明,当我们每次选择连通块的重心作为分治中心的时候,点分树的深度最小,为
由于树的形态在动态点分治的过程中不会改变,所以点分树的形态在动态点分治的过程中也不会改变。
下面给出求点分树的参考代码:
实现修改
在查询和修改的时候,我们在点分树上暴力跳父亲修改。由于点分树的深度最多是
在动态点分治的过程中,需要一个结点到其点分树上的祖先的距离等其他信息,由于一个点最多有
在动态点分治的过程中,一个结点在其点分树上的祖先结点的信息中可能会被重复计算,这是我们需要消去重复部分的影响。一般的方法是对于一个连通块用两种方式记录:一个是其到分治中心的距离信息,另一个是其到点分树上分治中心父亲的距离信息。这一部分内容将在例题中得到展现。
给定一棵有
-
反转一个结点的颜色(白变黑,黑变白);
-
询问树上两个最远的黑点的距离。
求出点分树,对于每个结点
我们可以根据上面的定义维护
现在我们来看一下,当我们反转一个点的颜色时,
假如我们要反转结点
参考代码:
给定一棵有
- 询问与结点
距离不超过 的结点权值和; - 修改结点
的点权为 ,即 。
我们用动态开点权值线段树记录距离信息。
类似于上题的思路,对于每个结点,我们维护线段树
在本题中,所有查询和修改都需要在点分树上对所有祖先进行修改。
以查询操作为例,如果我们要查询距离结点
在进行修改操作时,我们要同时维护
参考代码:
贡献者:@Menci@Ir1d@kenlig@mgt@Woshiluo@Shuhao@H-J-Granger@Henry-ZHR@ouuan@sshwy@雷蒻
本页面最近更新:2/3/2023, 12:00:00 AM,更新历史
发现错误?想一起完善? 在 GitHub 上编辑此页!
本页面的全部内容在 CC BY-SA 4.0 和 SATA 协议之条款下提供,附加条款亦可能应用