2019年6月20日木曜日

ARC 079 C - Decrease (Judge ver.)

ARC 079 C - Decrease (Judge ver.)

増減する数を選べるとすると、N+1N+1回操作をしたとき、最大値を取るaia_iN+1N+1減ってその他の数が変化しないようにできることに注目する。

ステップ1

すべての数がNN以上になる、またはすべての数がNN未満になるまでシミュレーションする。後者の場合はここで終わりである。O(N2){\mathcal O}(N^2)

ステップ2

上に書いた通り、数を適当に選んでN+1N+1回操作をすると、最大のaia_iN+1N+1減ってその他の数が変化しないようにできることに注目すると、すべての数が2N2N以下(かつNN以上)になるまでの操作回数をまとめて数えられる。

具体的に述べれば、aia_iに対して(N+1)(ai2N)/(N+1)(N+1)\lceil (a_i - 2N)/(N+1) \rceil回の操作をすると、aia_iが同じだけ減ってNai2NN \le a_i \le 2Nになる。1

ステップ1が必要なのは、(ai)(a_i)の最小値がNN未満だとN+1N+1回の操作の途中で問題の条件を満たしてしまう場合があるからである。入力例4がこれに該当する。 O(N){\mathcal O}(N)

ステップ3

すべての数がNN未満になるまでシミュレーションする。O(N2){\mathcal O}(N^2)


  1. 実際にはaia_iを選んで操作できるわけではないが、最大値が2N2N以下になるまでにそれぞれのaia_iに対して(N+1)(ai2N)/(N+1)(N+1)\lceil (a_i - 2N)/(N+1) \rceil回の操作をすることには変わりないので、順番は気にしなくてよい。 ↩︎