問題
$n$ 個の気温を変える魔法があり, $i$ 番目の魔法は「気温を $a_i$ 度上げてから $b_i$ 度下げる」という効果がある.
最初気温は $0$ 度で,ここから各魔法を好きな順番で一度ずつ唱える. このとき,途中の気温の最大値を最小化せよ.
制約
- $1 \leq n \leq 10^5$
- $1 \leq a_i, b_i \leq 10^9$
考察
座布団 DP のように,隣接する要素について「スワップしても損しない」ような条件を考える.
まず $a_i - b_i$ の正負,すなわち魔法を唱えた後気温が下がるかどうかに着目する. もしも $a_i - b_i \geq 0, a_{i + 1} - b_{i + 1} < 0$ なら,この 2 要素はスワップした方が良い.これは以下から従う。,
$$ \begin{aligned} \max(a_i, a_i - b_i + a_{i + 1}) &\geq \max(a_i, a_{i + 1}) \\ &\geq \max(a_{i + 1} - b_{i + 1} + a_i, a_{i + 1}) \end{aligned} $$
よって前半に $a_i - b_i < 0$ のもの,後半に $a_i - b_i \geq 0$ のものを詰めて良いことが分かった.後はこの中で最適な並べ方を考えればいい.
まず $a_i - b_i < 0$ の方から.実はこのとき,「 $a_i$ について昇順に並べる」のが最善.これは $a_i > a_{i + 1}$ のとき以下より従う。
$$ \begin{aligned} \max(a_{i + 1}, a_{i + 1} - b_{i + 1} + a_i) &\leq \max(a_i, a_{i + 1}) & (\because a_{i + 1} - b_{i + 1} \leq 0) \\ &= a_i \\ &= \max(a_i, a_i - b_i + a_{i + 1}) & (\because a_i > a_{i + 1} \geq a_i - b_i + a_{i + 1}) \end{aligned} $$
そして $a_i - b_i \geq 0$ の方も,後ろから考えれば $b_i - a_i \leq 0$ なので「後ろから $b_i$ について昇順」,すなわち「 $b_i$ について降順」に並べるのが最善となる.
後はこの順にソートしてシミュレーションすれば OK.
実装例
提出 #8218670 - AtCoder Regular Contest 053
|
|