WQS二分

颓废的学的感觉已经懂了。

忘情水二分(忘情水->斗罗大陆里是离魂果/cy) 也叫带权二分。

主要用来求出 在...之中选出恰好k个...求最小/大代价

这种情况我们可以用wqs二分来优化dp什么的。

上一道例题来分析带权二分吧.

[国家集训队2 Tree I](https://www.luogu.com.cn/problem/P2619)

一张无向图有黑边和白边 求出一棵含恰好k条白边的最小生成树。

怎么做?我们先求出任意一棵最小生成树之后再调整是很困难的。

dp?但是这样就只能状压了 因为我们需要知道树的状态什么的 复杂度过高。

这个时候就需要wqs二分了 这刚好是带权二分的模型 恰好k条白边.

先放上一篇讲wqs二分很不错的blog:[Creeper_LKF大佬](https://www.cnblogs.com/CreeperLKF/p/9045491.html)

下面我就可以开始瞎bb了/cy 首先设g[x]表示选出恰好x条白边的最小生成树的的权值 我们把画一个x-g[x]图像。

显然是一个凸包 我们问题的答案就是 横坐标x=k 时y=g[k]的这个y.

但是我们只知道形状却求不出来 考虑拿一条直线去切这个凸包 当然我们随便搞一个斜率去切就行。

这和斜率优化的模型时一致的 我们想办法让这条直线切到最优值 类似于线性规划我们一定可以在凸包的某个点上找到最优解。

什么叫最优解这里我给出的定义是 让截距最大的那个点即。那么此时因为斜率切到了点这条直线的解析式位y=kx+b(b此时是最大的b)

反过来想 b=y-kx 即b=g[x]-kx 下面就是重头戏了.

我们现在已知的是随便选择若干条边所能得到的最优解这个是我们可以求出来的设选择了w条边对应的最优解位v

考虑一下上面的那个斜率 b=v-kw; 这个斜率代表了什么 每选择一条边就要-k

也就是说此时存在一个斜率k使得其切点在w上并且此时是最优解.

但注意此时显然k为0 因为我每选择一条边代价为原来的这条边的代价-0

这意味着我们可以是求得最优解的 我们只需要让在求得最优解的同时使得切点横坐标刚好为x即可.

二分这个k 求最优解 同时我们也可以的出当前最优解在x的左边还是右边 再进行二分即可。

最后,我们发现二分的k可能是小数 而小数二分效率很低甚至二分不出来的样子(因为不可能完全二分出k...

但是我们其实是可以不二分小数的直接二分整数 因为直线的斜率的k在一定范围内都是会切到同一个点上的。

这样会到这 最后二分出了一个 mid 使得cx可能刚好二分不到x

但是此时一定有黑白边边权相同的情况 我们排序优先白色排即可使mid的更合法化。

于是当c>=x时我们可以构造出c==x的情况所以求出了答案.

posted @ 2020-02-05 20:19  chdy  阅读(218)  评论(0编辑  收藏  举报