1

最近遇到了一个叫做重力树的问题 ,我自己解决不了,所以我查看了社论. 作者的解决方案是对顶点进行一次 dfs 并形成一个分段树。其中每个节点包含从顶点到中心的距离。然后他提到了第二个 dfs(我不知道那在做什么。我尝试打印他的数据结构,但它们完全没有意义。不知道他实际上在做什么)。他写的语言有点太难掌握了。我知道什么是段树、dfs、惰性传播。但我无法围绕这个解决方案。不知道解决方案让我非常焦虑,我无法专注于其他事情。如果有人能给出更清晰的解释,那就太好了。以至于其他糊涂的人也受益匪浅。提前致谢 :)

问题制定者很固执。

4

1 回答 1

0
  1. 从节点“1”开始深度优先遍历树

    1a.现在,当您遍历时,添加从 1 到正在遍历的节点的距离。以及从1到节点下节点的距离。我们称之为Y1。因此,对于每个节点,都有一个 Y1,它保存从 1 到其自身及其子树节点的距离之和。还存储平方距离的总和,如果 Y2 则调用。现在我们还可以在子树中存储元素的数量。

所有的预处理都完成了。现在询问作用于 1 的力,假设某个节点 x 已打开,我们可以直接打印 Y2[x]。但是腿现在说除了 1 之外的其他节点说 u 需要计算。然后用 LCA 计算距离。现在称这个距离为d。现在我们可以通过减去 n 次 d 来修改 Y1。并相应地修改 Y2 =Y2-n d d+2Y1*d 这是简单的数学运算。因此,每个查询都需要 log(n) 时间加上一些常数

于 2016-12-25T20:43:29.327 回答