这道题有没有可能用 LCT 维护子树信息水过去(

P3676 小清新数据结构题

@[zhiyangfan](/user/137603) 这个本质就是求 $\sum_{x,y}dep[LCA(x,y)]val_{x}val_{y}$。容易实现吧,只不过信息复杂一点。
by jerry3128 @ 2021-11-18 13:12:47


艹,好像写炸了,晚上再调一调,下午有点事(
by jerry3128 @ 2021-11-18 13:20:16


@[jerry3128](/user/27338) 好的好的,谢谢您。 ~~我应该是把维护的东西搞错了~~ 我再调一下试试(
by zhiyangfan @ 2021-11-18 14:32:07


@[zhiyangfan](/user/137603) [code](https://www.luogu.com.cn/record/62931966) 这个维护的东西会根据根的变化而变化,所以要维护逆向的值,翻转的时候交换,我看你这点好像都没有写出来。(
by jerry3128 @ 2021-11-18 19:21:23


@[jerry3128](/user/27338) /jk/jk 谢谢您/bx 我以为 $\rm makeroot$ 操作可以解决了( 我研究一下您的代码qwq
by zhiyangfan @ 2021-11-18 19:24:32


@[zhiyangfan](/user/137603) 我看了下你的代码。 link 函数拉实边是因为加虚儿子会影响子树信息。而此题只在一开始 link ,你在 link 的时候信息为空,所以不加入子树信息的话正确性没有问题,但如果一个节点本身有信息,拉虚边就需要加入子树虚儿子的信息集合当中,注意不要搞错了。(
by jerry3128 @ 2021-11-19 10:22:24


有的时候虚子树信息复杂,所以拉实边直接 push_up
by jerry3128 @ 2021-11-19 10:23:07


而且还要注意若维护子树信息,任意节点修改都必须 access,因为 access 后的信息才在根链,不会有后效影响。
by jerry3128 @ 2021-11-19 10:24:31


@[jerry3128](/user/27338) 确实是这样,刚刚有一个维护子树大小的题就是拉虚边忘加信息调了好久。 其他地方都明白了qwq谢谢您的细心指导,能不能简单说一下您维护 `ans` 的思路呢。我感觉我那个代码注释写的有点问题,维护的两个部分 `dep` 那一部分是不一样的,感觉一个是把子树内的点往上去匹配,一个是子树内的点相互匹配qwq。(而且子树内的点的 $\rm lca$ 也不一定就是那个点啊)确实没太想通。
by zhiyangfan @ 2021-11-19 12:42:33


@[zhiyangfan](/user/137603) $ans=\sum_{x,y}dep[LCA(x,y)]val_{x}val_{y}$ push_up 时 x 节点维护跨越链的贡献。 发现虚儿子点权的后缀和就是深度带权。 有两部分贡献: 1. LCA 在 x 的原树祖先链上:所以就是左子树即 x 自己的深度带权子树和 乘上 右子树与虚子树子树和。 2. LCA 在 x 的原树子树内,LCT 右儿子:直接把答案加上不带深度权的子树和乘积乘左儿子深度。 维护的时候发现 x 自己的容斥有点多,就单独拿出来算了。(
by jerry3128 @ 2021-11-19 14:20:49


| 下一页