标题说的三个玩意都差得不是很多。
上论文 : WQS二分
例 : 在树上选k条路径使得权值和最大。。。
形如这类选k个的问题,一般的做法是在DP中加一维表示已选了几条路径。
但是,毒瘤一点的出题人就会把范围开到10^5,MLE+TLE
这时就要用WQS二分这个小套路了。
既然在DP中加一维不可取,我们只能直接DP。
但是DP出来的结果并不一定是选了k个的。
大佬开始了他的妄想,要是结果刚好是选了k个的那岂不美滋滋?
蒟蒻说,这怎么可能呢?
大佬说,我用我的双手,成就你的梦想。
show time:
原来的Dp数组: F[n] = min { F[i] + something }
定义 H[n] = min { H[i] + something + cost }
我们来看H和F有何区别
H每转移一次就要多付出cost的代价。
转移一次的物理意义(现实意义)就是多选了一个!!!!
既然选的个数多会付出代价,自然H[x]取最值时选的个数就会比F[x]取最值少。
然后可以通过调控cost(二分),进而调控选的个数为K。
蒟蒻说,可是你算的是H(n,K),我要的是F(n,K)
大佬说,随便画个柿子就推出来了
: F(n,k) = H(n,k)- cost * k
大意:通过引入可控常数控制选的个数,用另一个很好算的方式算出F(n,k)
蒟蒻开始码,3行过后,开始沉思,这个H怎么算啊!
大佬说,斜率优化凸包单调栈啊,再不济CDQ分治平衡树维护凸包都行啊。
蒟蒻打开了百度,数十行(年)后,开始二分。
大佬一声喝住,你没发现这个二分有问题吗?
蒟蒻说,我对二分答案还是很自信的。
大佬说,万一H[x]关于cost变化时没有最值呢?
蒟蒻说,你在说啥?
大佬说,万一H[x]不是一个先降后增的单峰函数呢?
蒟蒻说,你在说啥?
大佬说,所以F[x]应该是一个斜率单调不降的函数。
蒟蒻说,你在说啥?
大佬说,二分边界要小心。
蒟蒻说,噢,大佬真牛,这都想到了。
大佬:。。。。。。
为什么叫DP凸优化呢,因为F[x]斜率单调不降才能用二分代替一维DP。
为什么叫带权二分呢,给物品加上权好控制选的个数。
蒟蒻 : 真是恶心。
具体实现时关于可能二分不到点的问题:
https://www.cnblogs.com/CreeperLKF/p/9045491.html
[浅谈满足四边形不等式的序列划分问题的答案凸性](https://www.cnblogs.com/Itst/p/12805678.html)