關於WQS二分算法以及其一個細節證明


應用分析

  它的作用就是題目給了一個選物品的限制條件,要求剛好選$m$個,讓你最大化(最小化)權值,

  然后其特點就是當選的物品越多的時候權值越大(越小)。

算法分析

  我們先不考慮物品限制條件,

  假定我們要最大化權值。

  然后其中我們二分一個$C$,表示選一次物品的附加權值,

  如果我們$C$越大,我們選的物品個數越多,權值越大,

  於是當選的物品個數大於$m$時,減小$C$,否則增大$C$,

  最后計算答案的時候去掉$C$值的影響即可。

  Updata:這回還是講一講算法吧-->理論算法分析

  首先我們拿到一個題,然后發現有一個重要的條件:一共有n個數(下面有時候會稱為"點"),要求剛好選$m$個,有某種限制,以某種方式計算和(為了表示方便我暫且稱$h(x)$表示選第$x$個點的收益),選多少個和怎么選都會影響到答案

  同時我們一般可以得到一個關於n和m的dp方程$dp[i][j] = ......$,其中的復雜度一般都是$O(nm)$及以上的,無法接受,但是經過打表發現:設選$j$的數所的到的dp最大值為$g(j)$,然后發現$g(j)$關於$j$的斜率單調不增,也就是一個上凸包

  然后如果這題沒有剛好選$m$個的限制的時候就可以dp降維的話,那么就可以考慮一下WQS二分

  首先我們看一下$g$長什么樣子(橫坐標$x$表示我選多少個數,縱坐標$g(x)$表示我選$x$個數的情況下最大答案)。顯然求出$g(m)$就好了。但是問題是你求不出$g(m)$(時間復雜度高),也就是這個凸包暫時是求不出來的,但是我知道這個形狀。

  於是我們考慮通過用直線切這個凸包去求$g(m)$。然后構造一條直線,去切這個凸包,顯然我可以得到一個最大值(切到的那個點就是當前$x$的最大值),但是這個最大值不一定是取在題目要求的m的,例如我現在令m=7,然后我隨便拿一條斜率=$k$的直線去切,但是不是每一條直線都可以使$x=m$:

(為了方便后面我移動了一下$x=7$的點)

 

  我們發現斜率為$k$的直線切這個凸包上的點會切到一些點,每次切到一個點都會切到它的最大值(因為凸包上每一個點都是在固定選多少個數的情況下)

  然后我們就可以調整直線的斜率,然后直線就可以切到不同的位置,我們發現由於$g(x)$的斜率單調,所以直線斜率$k$切到的點的$x$同樣單調,也就是斜率越大$x$越大。

  我們首先假設去枚舉一個斜率為$k$的直線,然后我們要求這個切到了凸包的哪個位置,也就是$x$和$g(x)$,我們如何去求這個東西呢?我們發現斜率為$k$直線切到的點在凸包上可以得到一條完整的直線$y=kx+b$,然后其中切到的點的$b$比其它點的$b$都要大,也就是下圖:

  然后我們知道$b=y-kx$,換句話說$截距=g(x)-k*x$。怎么求出這個斜率呢?我們觀察這個式子,式子等價於:設$f(x)$為我在沒有固定選多少個點(但是我已經選了x個點)時的答案(也就是截距),一開始不求截距的話$f(x)=g(x)$,如果求截距的話我每選一個點那么$f(x)$就$-=k$,最終的答案$f(x)=g(x)-k*x$,也就是我只要把每個數的$h(x)-=k$然后正常求一下在選任意個數的情況下最大$f(x)$是多少。這個東西用dp去做,一般可以做到$O(n)$,而且dp的同時我們還可以知道當$f(x)$最大的時候的$x$是多少。也就意味着我知道了$g(x)$和$x$了!!!

  然后我現在拿着求出來的$g(x)$和$x$,於是就可以知道我二分大了還是小了,最后直到二分到$m$即可。

  關於$g(x)$斜率相等,如果不在答案附近那就沒有影響,如果在答案附近,那么當我二分出來的$x \geq m$的時候更新答案即可,因為你可以構造出一種合法的方案可以是$x=m$但是答案相等。

問題分析

  這看起來是沒什么問題的,然而我們考慮一件事情,就是如果我們最終要求$C$是個小數才能剛好選出m怎么辦?

  有人說:小數二分啊

  然而結果是

  所以小數二分會導致效率不高。

  我們思考一個問題:我們真的需要得到精確的$C$嗎?

  其實是不需要的,我們只需要在一個那個正確的$C$下的方案即可,因為$C$在最后從答案中減去了。

  然而可能出現一種情況,我假定二分到了$mid$,$mid$會使選的物品數為$m-1$,$mid+1$會使選的物品數為$m+1$......

  於是我們思考:能不能不二分到小數?

  答案是可以的:

  我們二分,當$選的物品個數 \geq m$時我們更新答案,同時排序上做點手腳。

  為什么?

  理論的分析就是上面那張圖由於$x$是一個整數,然后你切出來的直線的斜率$k$在一個范圍內都是落在同一個$x$點上。

  接下來可能是一個比較不理論的證明

基於bzoj2654 tree的證明

  題意大概是:

  給你一個N個點M條邊無向帶權連通圖,每條邊是黑色或白色。讓你求一棵最小權的恰好有K條白色邊的生成樹。

  解法就是WQS二分+MST

  然而這題的二分就有上面的問題

  反證:不存在沒有白邊黑邊相等的情況會出現二分在$mid$和$mid+1$的C不確定

  首先:如果沒有白邊黑邊相等,我們假定白邊權值為$w_1,w_2,w_3..w_x$,黑邊$b_1,b_2,b_3...b_y$,兩次枚舉的C為為$C_1+1=C_2$,$w_1+C_2 \neq b_1 ...$(所以是$white \geq need$) ...

  那么如果發生二分C值無解的情況,那么兩個C1,C2($C2=C1+1$)導致的至少選出來的白邊數量至少差了2(need-1&&need+1),由於差距大於2的和二的情況在下面等價,所以我們先考慮差距為2

  然后由於如果讓兩條白邊與黑邊的權值大小關系改變,那么我們至少需要讓2條白邊+1后的結果分別大於等於2條黑邊

  所以需要考慮的兩種情況就是 有兩條白邊的權值=兩條黑邊的權值-1 或 兩條白邊的權值=兩條黑邊的權值(基於C1) 

  注意我們還沒有考慮連通性,但是這是必要條件

  由於第一種情況直接不符合題設,我們直接忽略,我們考慮第二種情況,這種情況下C可能在C1、C2中間。由於此時的白邊權值在C1下等於黑邊權值,那么我們可以發現其實C1狀態下選黑邊白邊邊權等價。選擇導致的不滿足K的答案是合法的,因為我們可能會先統計黑邊,使得白邊沒有被統計然后導致不滿足K。然而這個問題我們可以直接通過在排序的時候允許第二關鍵字(按照顏色(這題白色優先))排序使得這種情況合法化。

  所以提出的兩種無解情況均不存在或者是可以通過算法避免 

如果有不嚴謹出請指正

然而我並沒有寫證明的經驗


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM