WQS二分学习笔记
WQS二分
WQS二分是一种可以处理一类带有限制的问题的方法,这种限制一般是恰好选 \(k\) 个的形式,而且要求原问题有凸性。
比如函数是上凸的,那么斜率就递减,如果我们去二分这个斜率,那么可以快速求出切点,而切点横坐标代表我们选择了多少个,于是我们就可以根据这个数目和题中要求的\(k\)进行比较,来判断斜率是该变大还是减小。
对于斜率,一般是理解成选择一个物品的额外代价,然后通过dp等方法求出最小值和选择的数量,再进行判断。另外要注意最终切点可能不等于 \(k\),要通过斜率算出等于 \(k\) 时的答案。
一些例题:
最小度限制生成树
即限制一个点的度数必须为\(d\)的最小生成树。可以给所有与这个点相连的边加上额外的权值\(k\),再跑最小生成树,根据这个点的度数判断额外代价是该减小还是增大。
CF739E Gosha is hunting
题意:有\(n\)个神奇宝贝,有\(a\)个宝贝球和\(b\)个超级球,前者抓住\(i\)的概率是\(p_i\),后者是\(u_i\),可以用两种球抓同一只,但每种至多用一个,求抓到神奇宝贝的个数的期望的最大值。
思路:wqs二分。每次二分出一个斜率\(k\),表示每使用一个宝贝球答案就减\(k\),然后求出用多少个超级球。这一步可以直接贪心。每个位置有四种情况,分类讨论一下即可。
[八省联考 2018] 林克卡特树
题意:在树上选出\(k+1\)条不相交的链使得链的边权和最大。
思路:WQS二分+树形DP。看到恰好多少条就想到了WQS二分,二分选出一条链的代价,然后用树形DP算出选出多少条链最优。具体的,设\(dp[i][0/1/2][0/1]\)表示在\(i\)的子树中,点\(i\)的度数为0/1/2,最后的0/1表示是权值还是选了几条链。转移时:
复杂度:\(O(n\log(n))\)。
April Fools' Problem (hard)
题意:有\(n\)道题,第\(i\)天可以花\(a_i\)准备一道题或者花\(b_i\)打印一道题,每天最多准备一道、打印一道,求最少的准备并打印\(k\)道题的花费。
思路:看到恰好\(k\)道就想到wqs二分,而看起来又很贪心,于是就把两个结合起来。
首先二分一个值\(mid\)表示每次打印的额外花费,然后在每个点有两种决策,准备一道题或者打印前面代价最小的一道题,这个过程可以用堆来维护,于是就可以了。复杂度\(O(n\log n\log V)\)。
P2619 [国家集训队] Tree I
题意:无向图每条边有两种颜色,求恰好有 \(k\) 条白色边的最小生成树。
思路:感性地发现答案关于 \(k\) 是有凸性的,于是考虑用 WQS 二分,二分用一条白色边的额外代价,然后判断选择的白色边个数即可。