浅谈一类树上贪心问题
浅谈一类树上贪心问题
这一类问题的套路是考虑先将局部顺序确定,最后合并以及确定顺序的连通块得到最后答案。
UVA1205 Color a Tree
考虑一个点 \(u\) 的左右儿子是 \(a\) 和 \(b\) 连通块,\(c_a\) 表示 \(a\) 里的点数,\(s_a\) 表示 \(a\) 里的点权和,如果对于 \(u\),先走了 \(a\) 再走 \(b\),这样的代价会是 \(c_us_a + (c_u + c_a)s_b\),否则代价会是 \(c_us_b + (c_u + s_b)s_a\)。
如果先走 \(a\) 优于先走 \(b\),则 \(c_as_b < c_bs_a\Longrightarrow \dfrac{c_a}{s_a} < \dfrac{c_b}{s_b}\),容易发现该条件具有传递性,所以可以根据这个来确定合并所有点的顺序。
AT_agc023_f [AGC023F] 01 on Tree
这题是类似的,设 \(a\) 中 \(1\) 的个数是 \(\beta_a\),\(0\) 的个数是 \(\alpha_{a}\),如果先走 \(a\) 优于先走 \(b\),则 \(\beta_a\alpha_b < \beta_b\alpha_a\Longrightarrow \dfrac{\beta_a}{\alpha_a} < \dfrac{\beta_b}{\alpha_b}\),容易发现该条件具有传递性,所以可以根据这个来确定合并所有点的顺序。
HDU6326 Monster Hunter
这题是拼好题,怪猎题有经典贪心,我们假设经过 \(i\) 需要消耗 \(a_i\),HP 会增加 \(b_i\)(包含消耗的 HP,这里的 \(b_i\) 是原题中 \(b_i - a_i\)):
如果先走 \(i\) 再走 \(j\),那么最后的 \(a\) 会变为 \(\max(a_i, a_j-b_i)\),否则会是 \(\max(a_j, a_i - b_j)\)。
- 如果 \(b_i, b_j \ge 0\),那么显然会先走 \(a\) 最小的。
- 如果 \(b_i \ge 0, b_j < 0\),那么显然会先走 \(i\),\(b_j\ge 0, b_i < 0\) 会先走 \(j\)。
- 如果 \(b_i, b_j < 0\),考虑上面的式子,如果先走 \(x\) 更优,则 \(\max(a_i, a_j-b_i) < \max(a_j, a_i - b_j)\),这等价于 \(a_i < \max(a_j, a_i - b_j), a_j-b_i < \max(a_j, a_i - b_j)\),第一个式子是显然成立的,因为 \(a_i-b_j>a_i\),第二个式子等价于 \(a_j-b_i<a_i-b_j\Longrightarrow a_j+b_j<a_i+b_i\)。
综上所述,该条件具有传递性,所以可以根据这个来确定合并所有点的顺序。

QwQ
浙公网安备 33010602011771号