[dp 小計] wqs 二分

g1ove發表於2024-04-18

天才演算法!
國外叫 Aliens trick (外星人 trick) ,真的太強了。
其實是因為 IOI2016 Aliens 這道題考了這個演算法才開始普及。

解決問題

wqs 二分一般用來解決如下問題。

給定 \(n\) 個數,求強制選 \(m\) 個的價值最大。

如果不是強制選 \(m\) 個,這類問題很好做。
現在問題就是怎麼取消掉強制取 \(m\) 個這個限制。

這就是 wqs 二分的用途,它能在一定條件下最佳化 dp ,\(O(nm)\to O(n\log m)\)

模型引入

wqs 二分有一個重要條件。
\(g(i)\) 表示當強制選 \(i\) 個時的最大價值,把所有 \((i,g(i))\) 在座標軸上畫出來,最終形成一個凸包。這就是演算法實施的必要條件。

還有一個必要條件就是,每個價值計算是獨立的,也就是說,\(w(\{x_1,x_2,x_3...\})=w(x_1)+w(x_2)+w(x_3)...\)

演算法分析

我們假設當前凸包是上凸的。
明顯,像斜率最佳化那樣,如果我們拿一條直線去切這個凸包(也就是把這條直線從上往下移,碰到的第一個點),那麼,很容易的發現,斜率越大,切到的點越往左。

我們想,如果拿一條斜率為 \(k\) 的直線去切,切到的是哪個點。
明顯,如果對於每個點都劃一條斜率為 \(k\) 的直線,那麼與 \(y\) 軸交點最上的的那個點,就是被切的點。

根據小學的知識,我們知道交點的計算公式是 \(f(x)=b=g(x)-kx\)
想想這是什麼。
這不就是等價於,把每個物品價值減 \(k\) ,就是 \(w(x)\to w(x)-k\)
然後,你要求 \(\max(f(x))\) ,不就是等價於取消了強制取 \(m\) 的限制了嗎!

在取消資格限制的同時,你還能把取到 \(\max(f(x))\)\(x\)