WQS 二分
WQS 二分用来处理一些答案构成凸函数的问题。
最经典、最常见的形式,就是 "从若干个物品中恰好选给定个数的最优" 型问题。
适用要求:如果不考虑选的物品的个数限制,可以很快求出答案。
最经典例题:P2619 Tree I
从所有白边中选
条,然后加上若干条黑边形成生成树,最优是多少。
为什么这是一个凸函数?记选
有没有可能
不可能。要证明这个命题,实际等价于证明任意连续三个数
采取反证法。如果
从
而
因此
证明是凸函数,然后怎么做?
上凸函数有一个性质:考虑一条斜率为
如果我们能求出切点横坐标
那么如何求出切点横坐标
性质:令
,则 为 的最大值。
很好理解,因为
结论:
为所有物品价值减去 后,不限制物品个数的最大价值。
为什么?发现此时的
因为我们可以快速求出不限制物品个数的最大值,所以自然也可以快速求出
怎么求
使每个物品价值减去
这道题还预留有一个问题:有可能我们根本二分不到
这是一个例子,当切点有很多个且
答案是我们不需要找到
具体在代码实现中,我们可以让黑白边边权相同时尽量选择白边,这样对于一系列截距相同的点,我们总会找到最右边的那一个。
但是这里也就存在着一个问题:如果出现了上面那种情况,我们在还原最优方案的时候需要额外注意,要调整价值为
的物品的个数来让总物品个数变成 个。
【非 "恰好" 型选择物品】
上面的算法是选择 "恰好
分两种情况。
-
如果
在 这个凸壳的左半部分(这里假定 是上凸)。直接求就行了。因为在左半部分, 随着 的增加而增加,"最多 个" 此时等于 "恰好 个"。 -
如果
在 这个凸壳的右半部分。暂时没有什么好的方法求。虽然没有方法求,但是这里介绍一种判断是否在凸壳右半部分的方案。
二分时将
设定为 。这样二分斜率时就不会切到右半部分,导致二分失败。
【WQS 二分与费用流】
在实际题目里想证明一个函数是凸的其实并不是一件简单的事。
但根据费用流的增广路长度单调不降的性质,可以得出费用是关于流量的凸函数。而在费用流建模中,流量一般也表示 WQS 二分中 "恰好选
因此如果我们能对原问题建出费用流模型,也就表示这个问题是有凸性质的,进而用 WQS 二分。
这道题的模拟费用流做法已经写过,由此可以得出原问题的凸性:最大收益是关于种树个数的凸函数。
因此可以 WQS 二分 + DP 解决。具体而言,二分斜率
【其他题目】
最小度限制生成树
给你一个有
个节点, 条边的带权无向图,你需要求得一个生成树,使边权总和最小,且满足编号为 的节点正好连了 条边。
同上题,二分斜率
忘情
题意:一段序列的代价是
。要求恰好分 段,使得总代价最小。
做法很简单(甚至我觉得比 Tree I 简单),wqs 二分套一个斜率优化 DP 即可。
这里二分结束后应选用
CF739E
有
个普通球和 个大师球以及 只宝可梦。第 只宝可梦被普通球捕捉的概率为 ,被大师球捕捉的概率为 。
捕捉一只宝可梦可以用一个普通球/一个大师球/普通球大师球各一个。(普通球大师球各一个的情况如果都成功了也只算作捕捉了一只宝可梦)
问最优策略下捕捉宝可梦个数的期望值。
当 wqs二分 应用在 DP 的题目上,一般叫做 DP 凸优化。对于 DP 凸优化的题目,先写出普通 DP 方程。
直接转移是
显然可以观察到,球越多,期望捕捉的个数就越大。所以
因此虽然是 "最多选取
于是复杂度优化到
发现算法的瓶颈在于求
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 没有源码,如何修改代码逻辑?
· PowerShell开发游戏 · 打蜜蜂
· 在鹅厂做java开发是什么体验
· WPF到Web的无缝过渡:英雄联盟客户端的OpenSilver迁移实战