Official

C - Robots Editorial by maroonrk


答えが \(0\) になる条件を考えます. \(B_i \geq A_i\) を満たすすべての \(i\) について,何らかのタイミングでロボット \(A_i\) を破壊できればよいです. ロボット \(A_i\) を破壊するのがロボット \(A_j\) だとします. もし,\(B_j \geq A_j\) なら,ロボット \(A_j\) も別のロボットに破壊されるはずなので,このロボットに \(A_i\) を破壊してもらうことにします. これを繰り返すと,ロボット \(A_i\) を破壊するロボット \(A_j\) は,\(B_j < A_j\) を満たすと仮定できます.

\(B_j<A_j\) を満たすすべてのロボットについて,\(A_j\) の昇順に,そのロボットを \(B_j\) 回動かす,とするのが最適です. この操作のあと,\(B_i \geq A_i\) を満たすロボットが生き残っていなければ,ロボット \(0\) を破壊せずに済みます.

ボールに書いてある整数を書き換えることを考えます. まず,ボールに書いてある数を書き換えるのではなく,いくつかのボールを削除し,そして新しいボールを追加する,という設定だと思い,\(\max(削除したボールの個数,追加したボールの個数)\) を最小化する問題だと思っても答えは変わりません. 証明は省略しますが,場合わけで示せます.

まず,ボールを \(1\) つも削除しないとします. この時,追加する必要のあるボールの個数は,\(B_i \geq A_i\) を満たすロボット \(A_i\) であり,\(B_j < A_j\) を満たすロボット \(A_j\) では破壊できないものの個数です.

次に,ボールを \(1\) つ以上削除するとします. 削除されたボールの中で \(A_i\) が最大のものを取ります. この時,明らかに \(B_i \geq A_i\) を満たします. このボールを消す個数は,\(B_i-A_i+1\) 個だとわかります. この時,番号が \(A_i\) 未満のロボットをロボット \(A_i\) が破壊できます. そして,ロボット \(A_i\),及び \(B_j < A_j\) を満たすロボット \(A_j\) では破壊できないロボットの中で,\(B_k \geq A_k\) を満たすロボット \(A_k\) の数だけ,ボールを追加する必要があります.

あとは,上述したケースを素直にチェックすればよいです. \(A\) が予めソートされていることを使うと,全体で \(O(N)\) 時間で解けます.

posted:
last update: