WQS二分
解决一类要求选择特定数量的某种物品前提下的最优化问题。
给你一个无向带权连通图,每条边是黑色或白色。让你求一棵最小权的恰好有
设
则
简易证明:若选
若不限制数量,则是一个简单的最小生成树。
看见凸包则联想到线性规划,能否将问题转化成给定斜率求最小截距的问题?
不妨设每选择一条白色边,就要多花费
转化一下
从几何角度看这个等于是一条过点
如果要截距
在这个基础上(每选择一条白色边,就要多花费
但是
从图上可以看出:
如果
如果
将这个斜率
最后由得到的
特殊情况:
注意这里,有可能存在并不能二分出一个斜率,让选中的边数恰好等于
比如这个斜率会同时和几个点相切,假设中间那个点是
如果你斜率恰好取到这个值,然后发现边的数量是
而如果你此时选出的边的数量是
最小生成树得到的边数不是
针对这道题目,解决办法是当边的权值相同时,优先选择白色的边
当一个斜率切很多点时,会默认选择横坐标最大的位置上(这里是
然后每当得到的
while(l<=r)
{
if(check(mid)>=m) ans=mid,r=mid-1;
else l=mid+1;
}
2
3
4
5
这样如果,当斜率同时切到
当然这样最后得到的结果也不是减去
这是下凸包的情况,如果是上凸包,你又优先选择了有数量规定的物品,因为上凸包横坐标左移是要斜率增大的,所以应该变成:
while(l<=r)
{
if(check(mid)>=m) ans=mid,l=mid+1;
else r=mid-1;
}
2
3
4
5
这个要根据你二分的写法来定,希望能完全理解凸包、切点和斜率的关系才不会错。
如果自己搞不清楚也可以记下来:
1、权值相同优先选有数量规定的物品
2、当选择的数量
3、如果是下凸包,
4、如果是上凸包,
当然还是希望你能完全理解其中含义。
总结:若问题根据物品选择的数量形成上凸包或者下凸包,当不限制数量时很好解决,就可以使用