AtCoder Beginner Contest 255 D問題 ±1 Operation 2
問題
提出解答
問題の概要
長さ の整数列 が与えられる. に対して, 次の質問に答えよ.
- の要素を にするために以下の操作は最低でも ( 回以上) 何回必要か?
- 以上 以下の整数 を選び, 以下のうちのどちらかを実行する.
- に 加算する.
- から 減算する.
- 以上 以下の整数 を選び, 以下のうちのどちらかを実行する.
制約
解法1 (答えの導出)
まず, が与えられた場合の答えを考える. このとき, 操作は項ごとに独立であることに着目する. このとき, できる操作は 「 加算」か「 減算」なので, 各項ごとにしなければならない操作は
- ならば 加算を 回する.
- ならば, 減算を 回する.
ということになり, 最小回数は である.
これを各項について考えることにより, 求めるべき解答は
である.
解答2 (高速化)
ここで, 解答について, の並び替えについて不変であることがわかる. よって, は並び替えてもよいことがわかる. そこで, を昇順に並び替えるとする. 以降では は昇順であるとする.
このとき, とすることにより, 各 に対して, となる 以上 以下の整数 が唯一存在する.
このとき, が昇順であることに注意して,
とおくと,
となる.
ここで, を求める方法について, が単調増加であることに注意すると, 二分探索で求めることができる.
よって, 計算量は前計算としてソートに 時間, を求めるためにまとめて 時間かかり, 各質問にたいして二分探索を利用することにより 時間で解答できる. 以上から, 全体では 時間となる.