勘探[jzoj6494]
题意
题解
$L$ 为奇数
首先来看看 $50$ 分的。
这时候重心在边上,这条边将树分成了两部分,且这两部分中叶子结点到根的路径为长度为 $\frac{L-1}{2}$。
那么设 $f_{i,j}$ 表示 $i$ 个点,最长路径的长度为 $j$ 的有根树的方案数。
考虑从 $f_{k,j-1}$ 转移过来,因为根节点已经是固定了的,所以儿子中只要有一个 $f_{k,j-1}$ 即可满足条件。
显然我们不能一个个枚举儿子选什么,因为会出现重复的情况,为避免之,再枚举儿子中最长路径长度为 $j-1$ 的节点个数,假设有 $l$ 个。
那么后面这个系数相当于是在 $f_{k,j-1}$ 棵树中选出 $l$ 个形成一个集合,可以重复选的方案数。由插板法可知,系数为 $\binom{f_{k,j-1}+l-1}{l}$。
那么则有:$f_{i,j}=\sum_{k}\sum_{l}f_{i-kl,j}\binom{f_{k,j-1}+l-1}{l}$。
需要注意一下枚举的顺序,且 $l$ 从小到大枚举即可用 $l-1$ 的组合数来 $O(1)$ 算出 $l$ 时的组合数。
但这只是最长路径长度为 $j-1$ 的,还可以有其他长度小于 $j-1$ 的可以插进去。
那么再维护多一个 $g_{i,j}$ 表示 $i+1$ 个点(除去根节点外还有 $i$ 个),最长路径的长度 $\leq j$ 的有根树的方案数。
用现在的 $f_j$ 和 $g_{j-1}$ 卷积以后就得到了真正的 $f_{i,j}$ 了。
然后再维护 $g$ 数组,方法和 $f$ 的是几乎一样的。
算出了 $f$ 数组,接下来的就很容易了。
枚举两部分中节点个数较少的节点个数 $i$,然后将 $f_{i,\frac{L-1}{2}}\times f_{n-i,\frac{L-1}{2}}$ 相加就是答案了。
需要注意一下当 $i=\frac{n}{2}$ 时的方案数。
$L$ 为偶数
然后再来考虑 $L$ 为偶数的。设 $x=\frac{L}{2}$。
和奇数类似,现在重心是一个点,将树分成了若干部分。但是可能会有很多棵子树。
我们需要满足至少有两棵子树的高度恰好为 $x-1$,且所有的子树高度都不能超过 $x-1$。
考虑容斥,用 $f_{n,x}$ 减去只有一棵子树的高度为 $x-1$ 的方案数。
那么枚举这个子树的节点个数 $i$,则此时方案数为 $f_{i,x-1}\times g_{n-i,x-1}$。
这个节点个数 $i$ 满足 $i\geq x,n-i\geq x$。
时间复杂度
我们需要枚举 $i,j,k,l$ 来计算 $f$ 和 $g$,但由于 $kl\leq i\leq n$,因此时间复杂度是 $O(Ln^2\log n)$ 的。
程序
1 |
|