ABC201 - F Insertion Sort

ABC201-Fを解いた

問題

順列Pに対して、次の操作を繰り返しPを狭義単調増加にする。コストの最小値は?
- 1 \leq i \leq Nを満たすiを選択し、P _ iを好きな位置に移動させる。
- 1 \leq i \leq Nを満たすiを選択し、P _ iを左端に移動させる。
- 1 \leq i \leq Nを満たすiを選択し、P _ iを右端に移動させる。
かかるコストは上から順にA _ i,B _ i,C _ iである。

解法

一番上の操作は下二つの操作の上位互換であるため、B _ imin(A _ i,B _ i)を、C _ imin(A _ i,C _ i)を代入してよい。
一回も操作をしないindexの集合をSを決めると、そのほかのindexに対する操作が一意に定まる。(具体的には、i  \lt min(S)を満たすiについては左端への、min(S) \lt iを満たすiについては右端への、そうでない場合は自由な挿入の操作を選択する)
ここで、
DP _ i = (max(S)=i の時の最小コスト/但し、右端に持っていく分は無視)
を考えると、P _ 1,P _ 2...P _ Nの順に
DP _ i = min( \sum _ {j=1} ^ {i-1} B _ {j} , min(DP _ j + \sum_{k=j+1}^{i-1} A _ {k}))
という遷移ができるが、このままでは間に合わない。これは最初に答えに\sum _ {i=1} ^ {N} A _ iを加算して置き(詳しくは実装を)、その差分を計算することを考え、区間min取得/一点更新ができるSegmentTreeを用いればO(N log N)で解が求まる。

考察

あんまり動かしたくない->動かさないものは単調増加->動かさないのに注目すればよさそう?

提出コード

https://atcoder.jp/contests/abc201/submissions/49860992