CF963-D. Med-imize
二分套動態規劃。
本題的中位數定義是 \(a_{\lceil\frac{n}{2}\rceil}\),有個 trick,\(x\) 可能成為中位數,當且僅當比 \(x\) 大的數多於比 \(x\) 小的數。
我們現在只需要關心每個數和 \(x\) 的相對大小關係,我們給 \(\ge x\) 的數賦權 \(1\),\(\lt x\) 的數賦權 \(-1\)。
容易發現 \(x\) 越大,序列中 \(-1\) 越多,總和越小,具有單調性。因此 \(x\) 具有可二分性。
問題轉化為:對於一箇中位數 \(x\) 得到的序列,能否透過刪掉若干個長度為 \(k\) 的子段,使剩下的序列總和 \(sum \gt 0\)。
即我們要考慮怎麼刪才能最大化 \(sum\)。發現一段區間刪不刪,不是很好直接貪(跟每個數所處的位置有關係),考慮動態規劃。
記 \(f[i]\) 表示 \(0 \sim i\),刪到長度 \(\le k\),總和最大值。(下標從 \(0\) 開始,方便下文性質)
怎麼判斷分段呢?發現一個性質:若 \(a[i]\) 被留下來了,最後下標一定是 \(a[i \mod k]\)。原因很好想,因為你只能 \(k\) 個 \(k\) 個刪, \(i\) 對於 \(k\) 的餘數肯定不變。
因此轉移可分三類:
\[f[i] =\begin{cases}f[i - 1] + b[i] \qquad & i \lt k \\\max(f[i], f[i - k]) \qquad & i \ge k \cap i\mod k \ne 0 \\\max(f[i - k], b[i]) \qquad & i \ge k \cap i\mod k = 0\end{cases}
\]
最後判斷 \(f[n] > 0\) 即可。時間複雜度 \(O(nlogn)\)。