长链剖分经典题目.
设 $f(i,j)$ 表示子树 $i$ 中距离 $i$ 为 $j$ 的点的数目.
设 $g(i,j)$ 表示子树 $i$ 中点对 $(x,y)$ 的数目,其中点对满足 $x,y$ 的 $lca$ 与它们的距离都为 $d$ ,而与 $i$ 的距离为 $d-j$ .
借用一下 $\text{Bill Yang}$ 的图片.
直接暴力合并 $u$ 与它的儿子节点 $v$ 的信息,时间复杂度是 $O(n^2)$ 的,只能通过原题.
注意到维护的下标是以深度为下标,利用长链剖分即可做到 $O(n)$ .
合并 $u$ 当前信息与它的儿子 $v$ 的信息时,转移有,
$$
ans+=f(u,j-1)\cdot g(v,j)+g(u,j+1)\cdot f(v,j) \\
g(u,j+1)+=f(u,j+1)\cdot f(v,j)\\
g(u,j)+=g(v,j+1) \\
f(u,j)+=f(v,j-1)
$$
利用指针移动实现空间的高效分配,以及继承重儿子信息.
1 | //%std |