题解:CF1585G Poachers
考虑对每棵树算
其中
考虑先给所有叶子挂一个虚点,这样就避免了特判一步删空。
发现这玩意和深度有关,于是我们可以得到一个基于长剖的线性做法。
- 如果
x 是叶子,sg_x=dp_{x,0}=0 。 - 如果
x 只有一个儿子v ,考虑其所有后代的sg 值组成的集合S_x ,可以发现有S_x=S_v\cup\{sg_v\} 。同时有sg_x=\operatorname{mex}S_x ,发现sg_x 可以从sg_v 暴力往上枚举,对于一整条长链,最多跳\Theta(len) 次。 - 如果
x 有多个儿子,考虑将所有dp_{x,i} 求出后直接暴力算出sg_x ,复杂度\Theta(lim_x) 。
也就是说我们总的复杂度为所有长链的长度之和,即
代码。