CF963-D. Med-imize

superl61發表於2024-11-04

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)\)

相關文章