perarduaadastra

競技プログラミングとかをしています

ARC079 E - Decrease (Judge ver.) O(N^2logN)解法

atcoder.jp

この問題を初ACした時に偶然編み出した解法です。当時は大分悩みましたが想定解よりも速そうなのでほくほくです。(ほんとうに速いのか?要検証)

 

解法:

二分探索を使います。当然、「x回の操作で全要素をN - 1以下にできるか」を判定に使います。x回の操作を決め打つと、一旦全ての要素を+xした上で-(N + 1)を何度かしてN要素全てがN - 1以下になるか判定する、というシンプルな問題になります。この判定はO(N)です。

 

ところで、二分探索を使おうと思ったら単調性を気にすることになります。つまり、ある値xで判定がTrueならx + 1だったらこれもTrueであってほしいですよね。今回これは成り立ちません。

 

ここで少し考えます。xの時Trueだったらx + Nの時もTrueでしょうか。これは正しいです。では、区間[x, x + N)をまとめて見ていくとしたら単調性があるのではないか。これも正しいです!

 

というわけで[x, x + N)すべてに判定を行なって境界となる区間を決め、最後に区間内全要素に判定を行なって終了です。総じてO(N^2logN)

 

atcoder.jp