Official

G - Longest Y Editorial by sugarrr


\(S\)Y である index を昇順に並べた数列を \(A\) とします。(サンプル \(1\) では \(A=\{1,2,6,8,10\}\) です。)
\(B_i = A_i -i\) として数列 \(B\) を定義します。

すると、問題は以下のように言い換えられます。

数列 \(B\) の要素を \(+1\) または \(-1\) することを合計 \(K\) 回まで行える。
同じ整数を最大でいくつ作れるか? \(\cdots(1)\)

答えに単調性があるので二分探索を用いることを考えます。
以下の判定問題を考えます。

数列 \(B\) の要素を \(+1\) または \(-1\) することを合計 \(K\) 回まで行える。
同じ整数を \(m\) 個作ることは可能か? \(\cdots(2)\)

\((2)\) を解くために、以下の問題を考えたくなります。

\(B_i,B_{i+1},\ldots,B_{i+m-1}\) を全て同じ整数にするには、合計で何回 \(+1\) または \(−1\) する必要があるか?

すなわち、

\(\displaystyle f(x) = \sum_{k=i}^{i+m-1} |B_k - x|\)
の最小値はいくつか? \(\cdots(3)\)

を知りたいです。

\((3)\) は有名問題で、\(f(x)\)\(x = B_{i+\lfloor \frac{m}{2} \rfloor}\) で最小値をとります。(理由がわからない方は \(f(x)\) のグラフを書いてみましょう。)

よって、前計算として累積和を求めておけば、\((3)\)\(O(1)\) で求めることができます。
以上より、\(N=|S|\) として \((2)\)\(O(N)\) で、\((1)\)\(O(N\log N)\) で求めることができ、この問題を解くことができました。

posted:
last update: