1. 程式人生 > >WQS二分——學習筆記

WQS二分——學習筆記

http://www.doc88.com/p-949564862405.html
http://codeforces.com/blog/entry/49691
我的理解 (不一定很對):
大概就是某個東西越多總貢獻越大,要求剛好取n個時的最優解。可以把 DP 狀態裡記的取的個數這一維去掉,而設一個 cost,取 k 個物品,總貢獻要多減去cost*k,然後 DPcost 越大,物品數取越少。 二分 cost 使得 DP 得到的答案剛好取了 n 個物品。
g(x) 表示取 x 個時的總貢獻。必須滿足 g(x) 斜率不增才能WQS二分。
f(x)=g(x)costx。我們需要找到 cost 使 f

max=f(x0),x0=n。要能用二分找 cost,必須 f(x) 是單峰,否則,f(x)=g(x)costcostx0 就不是個正常的遞減函式。若 f(x) 是單峰,則g(x) 斜率必須是遞減的。
注意到 g(x) 斜率可以是有相同的,雖然這樣一個 cost 可能對應多個 x0。這其實是沒有問題的:
f(x) 有連續一段都是最大值,也就是說二分到最後可能並沒有停在 n, 但答案還是能求的,反正值都一樣,當做停在 n 就行了,最後輸出的答案還是補回 ncost,而不能是最後的 midcost