應用分析算法
它的做用就是題目給了一個選物品的限制條件,要求恰好選$m$個,讓你最大化(最小化)權值,spa
而後其特色就是當選的物品越多的時候權值越大(越小)。blog
咱們先不考慮物品限制條件,排序
假定咱們要最大化權值。it
而後其中咱們二分一個$C$,表示選一次物品的附加權值,io
若是咱們$C$越大,咱們選的物品個數越多,權值越大,class
因而當選的物品個數大於$m$時,減少$C$,不然增大$C$,效率
最後計算答案的時候去掉$C$值的影響便可。im
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$點上。
接下來多是一個比較不理論的證實
題意大概是:
給你一個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可能在C一、C2中間。因爲此時的白邊權值在C1下等於黑邊權值,那麼咱們能夠發現其實C1狀態下選黑邊白邊邊權等價。選擇致使的不知足K的答案是合法的,由於咱們可能會先統計黑邊,使得白邊沒有被統計而後致使不知足K。然而這個問題咱們能夠直接經過在排序的時候容許第二關鍵字(按照顏色(這題白色優先))排序使得這種狀況合法化。
因此提出的兩種無解狀況均不存在或者是能夠經過算法避免
若是有不嚴謹出請指正