AGC008F - Black Radius

题意

给定一棵 nn 个节点的树,每一个节点有一个权值 0011。问有多少个本质不同的树上集合,满足其是某一个权值为 11 的点的 dd 邻域。点 xxdd 邻域定义为所有到 xx 的距离不超过 dd 的点的集合。称 dd 为邻域的半径。

1n2×1051\le n\le 2\times 10^{5}

部分分:所有集合的权值均为 11


标签

树形 DP,计数。


解法

子树的深度定义为最深点到子树根的路径上的边数。

先考虑部分分怎么做。此时即要求树上有多少个本质不同的邻域。

先考虑邻域为全集的情况。为了不让全集被计算多次,我们限定每一个点的邻域不能为全集,最后答案加上全集。若点 ii 的子树中最深的深度为 fif_i,次深子树的深度为 gig_i,那么显然邻域半径必须小于 fif_i

考虑两个邻域何时会算重:若树上有一条边 (u,v)(u,v),假设 uu 是根。若 vvdd 邻域覆盖了整个 uuvv 以外的子树,那么这个邻域与 uud1d-1 邻域是相同的,且 vv 必定是 fuf_u 所在的子树(否则无法覆盖其余子树)。这启示我们,对于每一个邻域,在使其半径最小的中心计算。容易发现,半径最小时,邻域的中心是确定的。

考虑每一个点 ii 为根,考虑其作为邻域的中心时对答案的贡献。其为邻域中心时,其半径不能太大。设其最大半径为 dd,则 fuf_u 方向儿子的 d1d-1 邻域不能覆盖 uu 的其它所有儿子。其它儿子中最远的到 vv 点距离是 gu+1g_u+1,即 d1<gu+1d-1< g_u+1,解得 d<gu+2d< g_u+2dd 再和 fu1f_u-1min\min,防止取到全集。ii 的邻域半径即为 [0,min(fu1,gu+1)][0,\min(f_u-1,g_u+1)]

当有一些点权值为 00 的时候,其合法邻域半径的下界不再是 00。但是有一些合法邻域仍然以 ii 的中心,仍然在 ii 计算这些合法邻域的贡献。

ii 为根,若 valival_i11,直接套用部分分的做法。否则,有 ii 可能有半径大于等于某个值 dd 的邻域也是合法的。考虑如何求这个 dd。以 ii 为根时,若某个儿子 vv 的子树中存在 valval11 的点,则当 dfv+1d\ge f_v+1 时,这个点的 dd 邻域的中心就是 ii 了。所以只要求出 hih_i 表示 ii 点所有儿子中,有可选点的最深子树的深度最小值。

那么可行半径范围就是 [hi,min(fi1,gi+1)][h_i,\min(f_i-1,g_i+1)]

换根 DP 即可求出答案。

虚树学习笔记