题解:AT_agc040_d [AGC040D] Balance Beam

· · 题解

写一个可能是题解区最简单的反悔贪心解法。

考虑有一个“判定点”,我们要求当 \text{Ringo} 从判定点出发时,\text{Snuke} 能够追上他。考虑对于一个固定的判定点检查是否有合法的排列方式。

先考虑判定点在整数位置的情况。则平衡木 i 有三种可能的情况:

则只要存在一种划分方式使得一类平衡木有 k 个且总贡献不大于 0,则判定点 k 合法。容易使用调整法求解该问题,即先把 a_i \leq b_i 的平衡木划分为第二类,a_i > b_i 的划分为第三类,再反悔 k 次即可。二类的反悔代价是 b_i,三类是 a_i

现在的问题是判定点可能不在整数位置。我们发现这等价于把一块平衡木“部分反悔”。具体的,我们可以返回一块平衡木的 k \ (0 < k < 1) 部分,若该平衡木为二类,代价是 kb_i,是三类则为 b_i + k(a_i - b_i)(读者自证不难),故我们可以枚举部分反悔哪一块平衡木,剩下的能反悔几块就返回几块,最后算一下这块平衡木的 k 是多少,对所有情况取 \max 即可。