题意:
给定一棵 个节点的树,每一个节点有一个权值 或 。问有多少个本质不同的树上集合,满足其是某一个权值为 的点的 邻域。点 的 邻域定义为所有到 的距离不超过 的点的集合。称 为邻域的半径。
部分分:所有集合的权值均为 。
标签:
树形 DP,计数。
解法:
子树的深度定义为最深点到子树根的路径上的边数。
先考虑部分分怎么做。此时即要求树上有多少个本质不同的邻域。
先考虑邻域为全集的情况。为了不让全集被计算多次,我们限定每一个点的邻域不能为全集,最后答案加上全集。若点 的子树中最深的深度为 ,次深子树的深度为 ,那么显然邻域半径必须小于 。
考虑两个邻域何时会算重:若树上有一条边 ,假设 是根。若 的 邻域覆盖了整个 除 以外的子树,那么这个邻域与 的 邻域是相同的,且 必定是 所在的子树(否则无法覆盖其余子树)。这启示我们,对于每一个邻域,在使其半径最小的中心计算。容易发现,半径最小时,邻域的中心是确定的。
考虑每一个点 为根,考虑其作为邻域的中心时对答案的贡献。其为邻域中心时,其半径不能太大。设其最大半径为 ,则 方向儿子的 邻域不能覆盖 的其它所有儿子。其它儿子中最远的到 点距离是 ,即 ,解得 。 再和 取 ,防止取到全集。 的邻域半径即为 。
当有一些点权值为 的时候,其合法邻域半径的下界不再是 。但是有一些合法邻域仍然以 的中心,仍然在 计算这些合法邻域的贡献。
以 为根,若 为 ,直接套用部分分的做法。否则,有 可能有半径大于等于某个值 的邻域也是合法的。考虑如何求这个 。以 为根时,若某个儿子 的子树中存在 为 的点,则当 时,这个点的 邻域的中心就是 了。所以只要求出 表示 点所有儿子中,有可选点的最深子树的深度最小值。
那么可行半径范围就是 。
换根 DP 即可求出答案。