南外集训 2023.12.29 T1
首先枚举宝藏所在的点,设为根 \(rt\),考虑如果在某个时刻访问了若干个点,但是没有确定宝藏位置,那么满足什么条件。首先求出这些点的 LCA,设为点 \(p\),\(p\) 不可以是 \(rt\)。我们发现这时候我们已经确认了宝藏到 \(p\) 的距离,而且知道它不属于 p 的哪些子树(所有存在被访问点的子树)。所以如果宝藏位置已经被确定为 \(rt\),则应当满足以下条件:
- 在 \(p\) 到 \(rt\) 路径上(不含 \(p\)),每个点 \(u\) 旁边挂的子树深度不能超过 \(dis(u, rt)-1\)。注意到对于任何 \(u\) 这是一个定值。
- 所有 \(p\) 的子树,如果内部没有点被选,则深度不超过 \(dis(p, rt) - 1\)。
第一个条件我们很好处理。预处理出所有位置,使得它的父亲的某个不是它的儿子深度超过了限制,并且它是根到它路径上第一个这样的点,那么只要所有被选的位置都在这个子树内,就一定合法。注意到我们没有钦定 LCA 恰好是某个点。
第二个条件是棘手的。我们枚举点 \(p\) 使得它父亲到根都是合法的,然后相当于要求至少有两个子树不为空,并且至少有一个空子树够深。至少两个子树不为空很容易——求出满足后一个条件的答案以后,枚举所有子树,认为只在这个子树内,然后减掉这些方案的贡献即可。然而至少一个空子树够深这个条件是比较难的,我们需要采用容斥来处理。
找出那些深度够的子树,在其中直接钦定 \(t\ge1\) 个必须为空,带上容斥系数 \((-1)^{t-1}\)。假设这些子树大小和为 \(s\),则贡献是 \(\sum\limits_{i=1}^s\frac{s!(n-i)!}{(s-i)!}\)。于是这启发我们,DP 计算子树大小和为 \(s(1\le s\le sz_p)\) 的带容斥系数和,然后直接代入计算贡献。复杂度为 \(\Theta(n^3)\)。