AtCoder Regular Contest 147 A問題 Max Mod Min
問題
提出解答
問題の概要
長さ の正の整数列 がある.
次の操作を の長さが になるまで繰り返し行う.
- を満たす 以上 以下の整数 を1つ取る. その後, を で置き換える. そして, ならば, から を取り除く.
このとき, 各操作において, 条件を満たすような の取り方に依らずに操作の回数は等しいことが証明できる. その操作の回数を求めよ.
制約
解法 1
整数の剰余について, 以下の事実が成り立つ.
を で割った余りを とする. このとき, が成り立つ.
証明
よって, 各項において, 最大値として選ばれるとその項は半分以下になる. このことから, 最初に であった項が選ばれる回数は高々 回である. このことから, 答えを としたとき,
が成り立つ. 今, であったから, にある最大値, 最小値を選ぶ操作を高速にできれば愚直なシミュレーションで計算できそうである.
解法 2
では, 高速に求める方法を考える. このとき, 実は次のようにして高速にシミュレーションすることができる.
- を昇順にソートし, を両側 Queue とみなす.
- 以下の操作を である限り繰り返す.
- の末項を dequeue し, その項を とする. また, の初項を とする (pop はしない).
- としたとき, ならば, を に挿入したいが, であるから, の初項に enqueue する. ならば何もしない.
計算量はソートパートとシミュレーションがボトルネックになり得り, 時間で計算できる.