cf954H】的更多相关文章

挖我自闭了这是什么东西啊. 给出一棵深度为  的树,其中深度为  的节点有  个儿子.问树上的简单路径中长度在  之间的每个有多少条.  表示对于在  层的  个节点,向下走  步的方案数  表示对于在  层的  个节点,向上走  步的方案数 然后我们可以得到这样的递推式. f[i][j]=a[i]*f[i+1][j-1]); g[i][j]=(j>=2)*(a[i-1]-1)*f[i][j-2]+g[i-1][j-1]): 显然对于一条路径会算两次.所以最终答案除以 2  即可.你以为这就完了…
一开始的想法是枚举路径的 \(\rm LCA\) 然后再枚举两边的深度,但是这样无论如何我都只能做到 \(O(n ^ 3)\) 的复杂度. 只能考虑换一种方式计数,注意到点分治可以解决树上一类路径问题,于是我们考虑使用类似点分治的方式对树上路径计数. 具体地,我们考虑计算以 \(i\) 为端点的路径数量,那么就会存在两种路径:向上走的和向下走的,分别令其为 \(f, g\). 因为深度相同的点都是等价的,因此我们将状态设置为: \(f_{i, j}\) 表示从 \(i\) 开始往上长度为 \(j…