Round 2 H
Solution 1:
考虑任意一个点
对于点
-
跨过
u 的不同子树中的贡献设链上的节点个数为
\alpha =({\rm dep(x)}+{\rm dep(y)}-2{\rm dep(u)}+1) ,路径长度为\alpha - 1 ,链以外点的个数为{\rm siz}(u)-\alpha ,因此对于跨过u 的贡献和就是\frac{1}{2}\sum_x\sum_{y,y不和x同一子树}\sum_{i\geq 0}^{{\rm siz}(u)-\alpha}\binom{{\rm siz(u)-\alpha}}{i}(i+2)(\alpha - 1) 后面的和式化简一下,变成
(\alpha - 1)(2^{{\rm siz(u)}-\alpha + 1}+k2^{{\rm siz(u)} - \alpha - 1}) -
以
u 为端点的和刚才的方法一样,只不过现在只需要枚举子树中的点
x ,然后另一个端点设为u 即可\sum_x(\alpha - 1)(2^{{\rm siz(u)}-\alpha + 1}+k2^{{\rm siz(u)} - \alpha - 1}) 发现处理了所有路径并且只跟路径长度有关,点分治即可,复杂度
O(n \log n)
哦不对,要对
Solution 2 :
我们发现对于距离为
对于根的移动,变成
然后换根
upd: 转移又臭又长,上面预处理子树答案是以子树为根的情况下,换根向子树内转移的时候,要先扣掉d(子树答案),即距离+1的子树答案,然后把这部分对于子树来说是父向子树的答案距离再迭代+1,然后加上之前算出来的子树答案。