wqs二分
wqs二分
发现网上的 wqs 二分文章都在凸包凸包,其实跟凸包关系不大。
由于本文的证明更为代数,所以无图警告!
wqs 二分(也叫带权二分)用于解决一类问题,这种问题的特征非常明显。
1.钦定在
2.直接做不管怎么优化都是
3.设
由于性质2你直接做大概率用 dp ,去掉之后大概率也用 dp ,所以这算法也叫 dp 凸优化
当然直接基本不是反悔贪心就是 dp 。
对于一道题,如果有性质 1,2,但你不知道有没有性质3,你可以直接猜它有
这个算法不结合例题理解十分抽象,在这里放一道例题。
gmoj8118. 【2022.10.12联考noip模拟】coffee
题意
在接下来
你手上有m张优惠券,每张优惠券会在第
需要注意的是,由于老板并不聪明,咖啡的价格可以变成负数。
由于你最近出题很累,需要喝咖啡补充能量,但是过多的咖啡因不利于身体健康,所以你决定在这
求最小花费。
这道题一眼满足性质1,2。
性质3并不一眼,但我们通过简单推理发现也是符合的。
套路地,先考虑去掉
然后考虑反悔贪心,我们把优惠券按照
但是可能后面的另一个
上述操作可以用堆维护。
这样如果需要反悔,对答案的贡献相当于
注意可能出现
这样复杂度
接下来我们二分一个
然后我们用反悔贪心计算此时的答案。并记录此时答案选择的咖啡杯数
接下来分讨。
如果
如果
否则说明权值给的太大了,
然后做完了。
但是有一种特殊情况(虽然本题造的数据并没有):
二分权值为
这种情况如何处理呢?我们考虑
一个看起来很好的做法是小数二分 ,确实可以,但有的题卡你小数二分。
我们考虑为什么会出现这种情况,发现是因为出现
那么我们发现我们两种方法之间如果替换是等价的,也就是说我们可以把
也就是说我们直接在
如果你先选"虚拟咖啡",也行,只是我们变成把
这种时候在
因此,我们在维护堆的时候,要加一个第二关键字,表示它是真咖啡还是“虚拟咖啡”,并且第二关键字一定要有大小关系,否则你就不能直接统计答案!!!
这样就做完了,时间复杂度
假如你对这道例题有了一些一知半解的理解,我们就可以开始抽象模型。
抽象模型
我们考虑原本答案为一个函数
我们减权值的操作相当于构造一个新的函数
然后我们希望这个函数的最值是
但是显然我们构造出的方案不一定能满足这个条件。
我们考虑最值位于
即
当
只要不满足这个条件,则
至于上题中的特殊情况,我们发现是出现了
而我们的处理方式就是只记录这种情况的最左点或者最右点,因为答案都是一样的,所以选择哪个点其实没区别,只要减掉的是对应的额外贡献就行。
所以 wqs 二分是对的。
习题
P2619 [国家集训队] Tree I
板中板,1,2,3性质都比较显然了。
套路地给白边二分加一个权值
P4383 [八省联考 2018] 林克卡特树
首先我们发现一件事,把链接在一起其实如接,一条大链的权值和与选出的
那么我们考虑先设一个 dp 状态
然后发现由于是选出
于是我们设
如果接上那么转移到度数+1,dp 值在权值和的基础上加上边权,否则转移到度数相同的点,dp 值简单相加。应该还是好想的。
这样时间复杂度是
然后套个 wqs 二分,在 dp 的时候额外记录选了几条链即可。
时间复杂度
P4694 [PA2013] Raper
限制
考虑去掉
P6821 [PA2012] Tanie linie
双倍经验
三倍经验
考虑转化为恰好
然后考虑设
P5633 最小度限制生成树
传奇WA13发
最难点在于判无解,其他跟第一道例题类似。
考虑找到二分的左右端点
那么如果二分
然后直接做,注意到你不能每次 wqs 二分都排序,于是你先对关键边和非关键边分别排序再归并。
这样时间复杂度是
[ABC218H] Red and Blue Lamps
如果前面的题都会了应该能随便秒。
设