《dsu on tree》深度剖析

今天上午思考了很久的dsu on tree的原理,现在来整理下自己的理解。

dsu on tree:

首先,重儿子不一定只在重儿子子树内。对于每个非叶子节点,都存在一个重儿子。

为什么dsu on tree难以处理带修改的子树问题?

因为对于dsu on tree的dfs中,重儿子的子树只会被递归到一次,但是轻儿子子树上的点会被递归到多次。

所以如果修改可能造成多次修改的问题。

 

dsu on tree的递归逻辑:

对于以u为根的子树:可以分为两层

1:首先处理递归处理所有子树的信息:

处理子树的信息时,先处理所有轻儿子的信息,并且再处理完轻儿子信息后,把轻儿子的贡献就删去。

最后再处理重儿子的信息,然后不删去重儿子的贡献。

2:然后solve递归去处理以u为根的子树的所有信息::

此时我们已经标记了Son = son[u]。

这时我们再去递归以u为根的子树时,遇到重儿子就不递归了,因为重儿子的贡献我们并没有删去。

所以我们这时递归以u为根的子树时,只会走轻儿子的链,所以总复杂度才会降至nlogn。

 

假设我们现在处理完了以v为根的子树,那么v的重儿子的贡献没有删去,这样是否会导致重儿子的贡献统计到其他子树内?

并不会,因为如果我们现在转移到了u节点,如果它是v的祖先,那么他的子树中肯定有v的重儿子的贡献。

如果不是v的祖先,u是v的同祖先的儿子,因为我们的递归重儿子会最后被递归到,并且轻儿子被递归后,就会被删去贡献,那么在搜u的时候就不会存在其他统计子树的贡献。

 

posted @ 2021-05-17 17:30  levill  阅读(35)  评论(0编辑  收藏  举报