为什么要进行第二次深度搜索?

时间:2016-12-24 09:38:58

标签: depth-first-search segment-tree lazy-propagation

最近我遇到了一个名为Gravity Tree的问题 我无法自己解决,所以我检查了editorial。作者的解决方案是在顶点上进行dfs一次并形成一个分段树。其中每个节点包含从顶点到中心的距离。然后他提到了第二个dfs(我不知道它在做什么。我尝试打印他的数据结构,但它们完全没有意义。没有知道他正在尝试做什么)。他写的语言有点难以理解。我知道什么是段树,dfs,懒惰的传播。但我无法围绕这个解决方案。而不知道解决方案让我非常焦虑,我无法专注于其他事情。如果有人能给出更明确的解释,那就太好了。因此,即使是其他困惑的人也会受益。提前谢谢:)

问题设定者是坚定的。

1 个答案:

答案 0 :(得分:0)

  1. 从节点' 1'

    首先遍历树上的深度

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

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