G - Approximate Equalization Editorial by kyopro_friends


本質的には公式解説と同じです。

目標とする条件は \(2\) 数の差のみによるので、全ての \(A_i\) に定数を加えても答えは変化しません。そこで、全体に適当な値を加えることで \(0\leq \sum_i A_i <N\) であるとして良いです。

目標とする条件「全ての \((i,j)\)\(|A_i-A_j|\leq 1\)」は、「\(A_i\) の値は高々 \(2\) 種類であり、\(2\) 種類ならその差は \(1\) である」と同値です。したがって、\(0\leq \sum_i A_i <N\) のとき、各 \(A_i\)\(0\) または \(1\) に変化させることになります。

累積和 \(S_i=\sum_{k=0}^{i-1}A_k\) ( ただし、\(S_0=0\) ) を考えると、操作は「\(1\leq i <N \)\(1\) つ選び、\(S_i\) の値を \(1\) 増やす、または \(1\) 減らす」となります。

以上から問題は次のように読み替えられます:
長さ \(N+1\) の数列 \((S_0,\ldots,S_N)\) が与えられる。\(S_0=0\)\(0\leq S_N <N\) である。「\(1\leq i <N \)\(1\) つ選び、\(S_i\) の値を \(1\) 増やす、または \(1\) 減らす」を行って、全ての \(i\)\(S_{i+1}-S_i\)\(0\) または \(1\) となるようにするための最小回数を求めよ。

任意の \(i\) で、操作後の \(S_i\) の取りうる値が \(0\) 以上 \(N\) 未満であることから、これは
\(\mathrm{DP}[i][j]=\) \(S_i\) まで条件を満たすように操作を行って、\(S_i=j\) であるようにするための操作回数の最小値
とするDPで求めることができます。
状態数 \(O(N^2)\) 遷移 \(O(1)\) であることから、計算量は全体で \(O(N^2)\) となります。

posted:
last update: