CF1988D The Omnipotent Monster Killer
Problem
怪物们在一棵有 $n$ 个顶点的树上,编号为 $i(1\le i\le n)$ 的怪物位于编号为 $i$ 的顶点上,攻击力为 $a_i$ 。你需要与怪物战斗 $10^{100}$ 个回合。在每个回合中,会依次发生以下两步:
- 所有活着的怪物攻击你。你的生命值会按照所有活体怪物攻击点的总和减少。
- 您选择一些(可以选全部,也可以不选)怪物并杀死它们。被杀死的怪物将不会再进行攻击。
限制条件:在一个回合内不能杀死相邻的两只怪物。
如果您以最佳选择方式攻击的怪物,那么在所有回合后,您的健康值减少的最小值是多少?
$1\le t\le 10^4,1\le n\le 3\cdot 10^5,1\le a_i \le 10^{12},\sum n\le 3\cdot 10^5$
Solution
这是一道再经典不过的树形DP了。太惭愧了。
每个节点的贡献可以表示为 $w_i\cdot a_i$ 的形式,其中 $w_i$ 表示怪物 $i$ 是第 $w_i$ 次被杀死的。可以证明 $w_i$ 不会超过 $\log_2(n)$ 。

图:Taibo
上图中,欲构造出 $w_i=x$ 的点,需要将该点连接上 $w=1,2,\dots,x-1$ 的节点。设构造出 $\max w_i=n$ 的树至少需要 $tot_n$ 个节点,则存在
即得 $tot_n=2^n$ 。也就是说对于一张 $n$ 个节点的图,其至多需要 $\log_2(n)$ 次选择就可以将所有怪物杀死。
下面开始dp。设 $dp_{x,k}$ 表示若第 $k$ 次杀死怪物 $x$ , $x$ 子树内的怪物至少会产生多少点伤害。
$dp_{x,k}$ 由两部分组成:
- 在第 $k$ 次杀死怪物 $x$ 之前,怪物 $x$ 会产生 $k\cdot a_x$ 点伤害。
- $x$ 的子树内的怪物(除了 $x$ 本身)产生的伤害。
其中 $u(x)$ 表示点 $x$ 的儿子节点。
最后答案为 $\min dp_{root,k}$
Code
1 |
|
← BACK TO INDEX
NOTE / 2024—07
本文作者:Vanilla
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
COMMENTS
via giscus