关于WQS二分算法以及其一个细节证实

应用分析算法

  它的做用就是题目给了一个选物品的限制条件,要求恰好选$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$点上。

  接下来多是一个比较不理论的证实

基于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可能在C一、C2中间。因为此时的白边权值在C1下等于黑边权值,那么咱们能够发现其实C1状态下选黑边白边边权等价。选择致使的不知足K的答案是合法的,由于咱们可能会先统计黑边,使得白边没有被统计而后致使不知足K。然而这个问题咱们能够直接经过在排序的时候容许第二关键字(按照颜色(这题白色优先))排序使得这种状况合法化。

  因此提出的两种无解状况均不存在或者是能够经过算法避免 

若是有不严谨出请指正

然而我并无写证实的经验
相关文章
相关标签/搜索