AtCoder Regular Contest 138 A問題 Larger Score
問題
提出解答
問題の概要
長さ の非負整数列 の先頭 項の総和を と書くことにする.
とする. に対して, 隣接項の入れ替えを何回か行い, 操作後の整数列を としたとき, とできるか? できる場合, その入れ替えの最小回数を求めよ.
制約
解法
の降順ソートを とする. このとき, だった場合は不可能である. また, が可能な最大値なので, だった場合は可能である.
可能であるとする. の先頭 項に現れ, の先頭 項に現れないのが , 逆に, の先頭 項に現れずに, の先頭 項に現れるのが であるとする ().
とする. このとき, であるから, を先頭 項から外し, を先頭 項に入れても目標を達成できる. これは上での段落での の場合に帰着し, 目標が厳しくなっていない.
よって, の場合のみを考えれば良い. に対して, であるとき, を先頭 項から外し, を先頭 項に入れるための最小回数は
- を第 項目に移動
- を第 項目に移動
- 第 項目と第 項目を交換
で達成でき, 手数は である.
従って, 求めるべきは
である.
を固定する. このとき,
であるから, より大きく, 添字が最も小さいのはどこか? という問題を解くことになる.
この問題は前計算として第 項目以降の累積最大値を取り, 二分探索によって高速に求めることができる. なお, 最初にソートで可能不可能判定をしたが, 最初にしなくても, 可能であることと となる が存在することは同値なので, 最小値を求める仮定で可能不可能判定もできる.
以上から, 計算量 で求めることができた.