前置芝士
基础二分+基础DP
算法流程
wqs二分是一个神奇的东西,经常用来把限制条件转化为二分来降低时间复杂度。
常见类型:在满足A物品强制选择了m个情况下总价值最大
如果不考虑 选择了m个 这个条件,我们只考虑总价值最大,我们能够得到一个时间复杂度比较优秀的算法。
现在考虑二分一下A物品的额外代价(可正可负),修改A的代价后重新进行刚才的算法,顺便记录一下价值最大的情况下选择了多少个A。
然后根据选择了多少个A来调整二分边界。
最后最优情况是选择k个A时,我们把额外代价删去就是正确代价
很多时候需要二分到小数,而且需要卡精度, 正确性有的时候还需要多考虑考虑。
证明
这个大佬证明的很详细
当然你也可以看一下我这个(滑稽)
设g(i)是选i个A的最优总价值,i为横坐标,g(i)为纵坐标作图。
我们要求的是g(m)
我们二分的就是直线斜率k(就是额外代价,至于为啥先往下看),如下
当k合适时,只有被切点为m,直线截距最大,设截距为f(i)
f(i)=g(i)-ki,如下图
把ki分配到i个物品上,就相当于给每个物品附加上了k的额外代价
很容易就能求出f的最大值
g(i)=f(i)+ki,我们根据f(i)取最大值的时候的i和m的大小调整二分
练习题
题单
P2619 [国家集训队]Tree I挺简单一道题,这道题貌似可以通过一些神奇操作不用二分到小数,但我看不懂证明(跪了)
P4983 忘情
一顿操作猛如虎,一化式子二百五,wqs二分+斜率优化DP,不会斜率优化DP的建议先学一下
P5308 [COCI2019] Quiz
wqs二分+斜率优化DP
P4383 [八省联考2018]林克卡特树