换根dp


先看一个题目 CF161D Distance in Tree

考虑 dp(当然点分治也可以做),先求出 f(u,k)f(u,k) 表示将树中的 uu 作为根节点后,深度为 kk 的节点数量,则答案为 uGf(u,k)2\dfrac{\sum_{u\in G}f(u,k)}{2}

可以暴力求 ff 数组,复杂度 O(n2k)O(n^2k)

优化一下,先以 11 为根节点,求出从每个点 uu 开始,向下走 kk 的路径条数 g(u,k)g(u,k)

设节点 uu 的一个儿子是 vv 。观察到如果求出了 f(u,k)f(u,k) 那么求 f(v,k)f(v,k) 可以利用一下信息。

红色部分显然是 g(v,k)g(v,k) ,蓝色部分是 f(u,k1)f(u,k-1),但是这样有一部分会多计算,就是那些以 uu 为端点,长度为 k1k-1 ,经过了红色部分的路径。减去 g(v,k2)g(v,k-2) 即可。

f(v,k)=g(v,k)+f(u,k1)g(v,k2)f(v,k)=g(v,k)+f(u,k-1)-g(v,k-2)

复杂度 O(nk)O(nk)