WQS二分学习笔记

1|0WQS二分

WQS二分是一种可以处理一类带有限制的问题的方法,这种限制一般是恰好选 k 个的形式,而且要求原问题有凸性。

比如函数是上凸的,那么斜率就递减,如果我们去二分这个斜率,那么可以快速求出切点,而切点横坐标代表我们选择了多少个,于是我们就可以根据这个数目和题中要求的k进行比较,来判断斜率是该变大还是减小。

对于斜率,一般是理解成选择一个物品的额外代价,然后通过dp等方法求出最小值和选择的数量,再进行判断。另外要注意最终切点可能不等于 k,要通过斜率算出等于 k 时的答案。

一些例题:

1|1最小度限制生成树

即限制一个点的度数必须为d的最小生成树。可以给所有与这个点相连的边加上额外的权值k,再跑最小生成树,根据这个点的度数判断额外代价是该减小还是增大。

1|2CF739E Gosha is hunting

题意:有n个神奇宝贝,有a个宝贝球和b个超级球,前者抓住i的概率是pi,后者是ui,可以用两种球抓同一只,但每种至多用一个,求抓到神奇宝贝的个数的期望的最大值。

思路:wqs二分。每次二分出一个斜率k,表示每使用一个宝贝球答案就减k,然后求出用多少个超级球。这一步可以直接贪心。每个位置有四种情况,分类讨论一下即可。

1|3[八省联考 2018] 林克卡特树

题意:在树上选出k+1条不相交的链使得链的边权和最大。

思路:WQS二分+树形DP。看到恰好多少条就想到了WQS二分,二分选出一条链的代价,然后用树形DP算出选出多少条链最优。具体的,设dp[i][0/1/2][0/1]表示在i的子树中,点i的度数为0/1/2,最后的0/1表示是权值还是选了几条链。转移时:

dp[i][0]=maxk=02dp[j][k]dp[i][1]=max(dp[i][0]+dp[j][1]+(wj,0),dp[i][0]+dp[j][0]+(wjmid,1),maxk=02dp[i][1]+dp[j][k])dp[i][2]=max(dp[i][1]+dp[j][0]+(wj,0),dp[i][1]+dp[j][1]+(wj+mid,1),maxk=02dp[i][2]+dp[j][k])

复杂度:O(nlog(n))

1|4April Fools' Problem (hard)

题意:有n道题,第i天可以花ai准备一道题或者花bi打印一道题,每天最多准备一道、打印一道,求最少的准备并打印k道题的花费。

思路:看到恰好k道就想到wqs二分,而看起来又很贪心,于是就把两个结合起来。

首先二分一个值mid表示每次打印的额外花费,然后在每个点有两种决策,准备一道题或者打印前面代价最小的一道题,这个过程可以用堆来维护,于是就可以了。复杂度O(nlognlogV)

1|5P2619 [国家集训队] Tree I

题意:无向图每条边有两种颜色,求恰好有 k 条白色边的最小生成树。

思路:感性地发现答案关于 k 是有凸性的,于是考虑用 WQS 二分,二分用一条白色边的额外代价,然后判断选择的白色边个数即可。


__EOF__

本文作者Xttttr
本文链接https://www.cnblogs.com/Xttttr/p/18014473.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角推荐一下。您的鼓励是博主的最大动力!
posted @   Xttttr  阅读(20)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示