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: