wqs 二分
强制必须选恰好 个物品的价值是 ,要求出恰好选 的答案也就是 .
如果 是凸的(差分单调,这里仅讨论上凸即差分不增),那么可以二分一个直线的斜率,让这条直线尝试切这个凸包,如果切点横坐标在 左侧,就减小斜率,否则增大斜率。最终切点的纵坐标即为答案。
二分一个斜率之后,怎么找到切点?大家都知道一条固定斜率的直线切这个凸包,第一个切到的点满足其截距最大。
也就是现在有直线 的 ,找到一个 使得 最大。
移项一下得到 ,考虑这个的实际含义,选出 个物品的同时,要减去物品个数 的代价。
那么给每个物品一个 的价值偏移,当成没有物品个数的限制来找到最优的答案即可。
wqs 二分的优越处在于,对于原问题,我们需要考虑选了多少个物品,而二分斜率并给每个物品一个多余的代价之后,问题变得不需要再考虑选了多少个物品。
几、细节
大部分题目答案 都是一个整数,所以凸包上的边的斜率,也就是相邻点的答案的差值 也会是一个整数,这种情况只需要二分整数,否则还需要二分实数。
多点共线情况处理起来更麻烦一些,假如说凸包是个这个形态,我们要求出的是 点的纵坐标:
斜率二分到 的时候,无论尽量少选的还是尽量多选都不会找到这个 点,但是可以通过截距 来求出 的纵坐标(注意这里并不是截距 “check 中选出的物品个数”)。
那么假如钦定每次少选:
当切点在 右侧时,此时切点可能是 及以后的点,斜率一定是错的,不标记答案,令 ;
当切点在 左侧时,此时切点可能是 及以前的点,斜率可能是正确的,标记答案,令 .
为了能二分到正确的斜率,不会死循环,每次令 ,判断继续二分的条件是 .
假如钦定每次尽可能多地选也同理:
当切点在 右侧时,此时切点可能是 及以后的点,斜率可能是正确的,标记答案,令 ;
当切点在 左侧时,此时切点可能是 及以前的点,斜率一定是错的,不标记答案,令 .
为了能二分到正确的斜率,不会死循环,每次令 ,判断继续二分的条件是 .
P2619
板子
CF739E
做法一:对 A 类球 wqs 二分,B 类球暴力 dp 记录其选了多少个。.
(假)做法二:wqs 二分 套 wqs 二分,.震惊了,这个是假做法吗
做法三:对 A 类球二分,然后内部贪心邻项交换法,这么神奇的吗?
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· TypeScript + Deepseek 打造卜卦网站:技术与玄学的结合
· Manus的开源复刻OpenManus初探
· 三行代码完成国际化适配,妙~啊~
· .NET Core 中如何实现缓存的预热?
· 阿里巴巴 QwQ-32B真的超越了 DeepSeek R-1吗?
2021-07-26 「学习笔记」四边形不等式优化 / 决策单调性优化 dp