ARC225 D - Gap Swap (easy)

遠隔交換(易)

考え方

各状態に対して、$S$ の値を以下のように定義する。

さて、コストを $c$ 払うと、距離 $c$ 離れた位置にある $2$ つの数を入れ替えることができる。
左へ動いた分は $S$ の値を減少させることがなく、右へ動いた分は最大で $c$ まで減少させられる。
よって、コストを $c$ 払ったときの $S$ の値の減少量は、大きくても $c$ である。

また、各数について、以下の文字を対応させて長さ $N$ の文字列を作る。

この文字列で、'N' 以外で最初に出現する文字は必ず 'R' である。
また、'N' 以外で最後に出現する文字は必ず 'L' である。
したがって、'N' を無視した場合に 'R' の次に 'L' があるところが少なくとも $1$ ヶ所ある。
この 'R' と 'L' の組にあたる部分に操作を行うと、払ったコストを $c$ とすると $S$ は必ず $c$ 減少する。

以上により、初期状態での $S$ の値を $S_0$ とすると、以下の $2$ つがわかった。

したがって、$S_0$ そのものが答えである。

計算量は、$O(N)$ である。

入力例1での動作

入力を受け取り、各要素から $1$ を引いて 0-indexed に直す。

n: 6
a: {5, 1, 2, 4, 3, 0}

各位置について、本来もっと右にあるべき値の移動距離を求める。

$i$ $a[i]$ $\max(0,a[i]-i)$
$0$ $5$ $5$
$1$ $1$ $0$
$2$ $2$ $0$
$3$ $4$ $1$
$4$ $3$ $0$
$5$ $0$ $0$

これらの合計は $5+1=6$ である。
したがって、答えは $6$ となる。

注意点

答えは、int 型からはみ出る。
long long 型を用いること。

別解

特になし。