arc116E

题意

Link


题解

答案显然具有单调性。

二分,对于 \(mid\) 我们计算最少需要几个点使得可以全部覆盖整个树。

我们有一个显然的贪心,对于以 \(u\) 为跟的子树,我们选 \(u\) 当且仅当子树内最深的到 \(u\) 的距离恰好为 \(mid\)

如何证明?

考虑如果不是这样,我们找到最深的一个选的 \(u\) 不满足上述贪心策略。

\(u\) 父亲,显然 \(fa_u\) 不劣于 \(u\)

考虑 \(fa_u\) 能更多照顾到 \(u\) 子树外的点,而且此时 \(u\) 子树内依旧合法。


有了贪心策略就很简单了。

我们维护 \(a_u\) 表示 \(u\) 子树内所选的点还能支持多远。

\(b_u\) 表示 \(u\) 子树内不能被覆盖到的点距离 \(u\) 的距离。注意 \(u\) 距离 \(u\) 0个距离。

考虑 \(\min_{(u,v)}{a_v-1}\)\(\min_{(u,v)}b_v+1\) 关系即可。

\(p=\min_{(u,v)}a_v-1,q=\min_{(u,v)}b_v+1\)

  1. 如果 \(p\geq q\) 证明 \(u\) 子树内不能被覆盖的点可以通过其他所选点覆盖。

    此时 \(b_u=-1\),\(a_u=p\)

  2. 否则如果 \(p=mid\) 代表必须采取行动选 \(u\) 覆盖,此时 \(b_u=-1,a_u=mid\)

  3. 否则,我们不覆盖,但是此时所选点也不会在产生贡献,所以我们可以直接 \(a_u=0,b_u=q\)

code

吐槽

at 的题解很奇怪,不是很懂为什么要提到 dynamic programming,也不解释 贪心策略。

这个贪心策略还是很明显的,但是正确性确实需要考虑,而我已经想到这个贪心,但是看到题解没提到贪心,而是放了一个 dynamic programming 就觉得自己错了。

希望这篇博客能帮到你吧。


arc116E
https://proton-z.github.io/2021/08/04/arc116E/
作者
Imitators
发布于
2021年8月4日
许可协议