首页 > 其他分享 >关于 wqs 二分的一言两语

关于 wqs 二分的一言两语

时间:2024-09-13 17:23:59浏览次数:10  
标签:二分 一言两语 白色 wqs 斜率 我们 dp

感觉一个比较入门的题目是 P2619。你要求的是恰好有 \(need\) 条白色边的,这个很难表示,因为如果直接跑一遍 MST,你不能保证一定选了 \(need\) 条,有可能白色边“太好了”或者“太坏了”。

但是我们发现,如果白色边“越好”,就会尽可能选白色,反之亦然。也就是说如果我们增加一个费用:给所有白色边边权 \(+c\),设 \(f(c)\) 为加 \(c\) 后的 MST 有多少白色边,这样如果我们算出 \(f(c)\) 和 \(c\) 的图像:\(f(c)\) 随着 \(c\) 增大减少。这样,就可以二分了!

感觉这个就是 wqs 二分的一个“感性理解”。遇到“恰好 \(k\)” 这种限制,可以采用带权二分。

但是上述不是真正的 wqs 二分(嘻嘻)。看看这题 P6821

因为这一题是“至多 \(k\) 个”,所以我们 dp 时不仅要考虑能达到的最大值,还有达到最大值的最小段数。

在这题中,设 \(f(k)\) 为选恰到 \(k\) 个最大值,则我们可以发现 \(f(k)\) 是一个上凸包:感性理解,\(k\) 太小时,加一点更好,而我们贪心加最好的,所以一定越加越慢,而到达一定点,只能加负数了,就越减越快。理性证明可以用费用流。

这样我们就可以二分每一次分出一个子段的费用了!就变成了一个一维 dp。

总结一下,wqs 二分出现在段数/个数有 \(k,\le k,\ge k\) 这种限制时,并且他的功能是把一个二维 dp 优化成一个一维 dp。

有可能会有一个疑问,就是为什么“上凸”“下凸”这么重要?如果不是这种函数,还可以 wqs 二分吗?wqs 二分究竟是二分什么?

回到上一题,我们二分费用 \(c\) 的时候,求出来有费用的是 \(g(k)\)。真正的答案是 \(f(k)=g(k)+c\times k\)。那么我们发现 \(g(k)\) 就是过 \((k,f(k))\) 点斜率为 \(c\) 直线在 \(y\) 轴的截距。所以,我们二分的 \(c\) 其实是斜率,我们算出来的是被切点。

  • 为什么“上凸”“下凸”这么重要?

因为如果不是这样的,斜率就不是单调的了。

再来看一道题:P6246

和上一题差不多,我们发现是下凸函数。就省略 解法 了。但是会出现一个 wqs 二分经常遇到的问题,就是为啥是 -l*m 而不是 -l*cnt[n],即为啥不是剪掉/加上最优方案实际选的次数来乘。

这篇博客里面解释了。有一个很直观的图。其实这种问题就是凸包上面点共线的情况。而我们算出来的是截距。如果要求在 \(m\) 处的点的值,必须要减去/加上 \(m\) 乘上二分出来的斜率。

标签:二分,一言两语,白色,wqs,斜率,我们,dp
From: https://www.cnblogs.com/SFlyer/p/18412554

相关文章

  • 二分图最大权完美匹配
    问题给定一个二分图,左部有\(n\)个点,右部有\(m\)个点,边\((u_i,v_j)\)的边权为\(A_{i,j}\)。求该二分图的最大权完美匹配。转化问题可以写成线性规划的形式,设\(f_{i,j}\)表示匹配中是否有边\((u_i,v_j)\),求\[\begin{gather*}\text{maximize}\quad&\sum_{i=1}^n......
  • 【每日一题】LeetCode 2576.求出最多标记下标(贪心、数组、双指针、二分查找、排序)
    【每日一题】LeetCode2576.求出最多标记下标(贪心、数组、双指针、二分查找、排序)题目描述给定一个整数数组nums,数组下标从0开始。你需要执行以下操作,直到无法再执行为止:选择两个互不相同且未标记的下标i和j。满足条件2*nums[i]<=nums[j],则标记下标i和j。......
  • 算法与数据结构——二分查找插入点
    二分查找插入点二分查找不仅可用于搜索目标元素,还可以解决许多变种问题,比如搜索目标元素的插入位置。无重复元素情况Question给定一个长度为n的有序数组nums和一个元素target,数组不存在重复元素。现将target插入数组nums中,并保持其有序性。若数组中已存在元素target,则插入到......
  • 线段树与二分操作 vases and flowers ——hdu 4614
    操作1,的关键是找到第一只和最后一只空花瓶,完全可以利用二分法查找,找第一只花瓶可以在[X,N]内查找,第一个位置pos1,最后一只花瓶则在[POS1,N]中找,然后更新[POS1,POS2],全部置1即可代码:#include<iostream>usingnamespacestd;constintN=5e4+5;structnode{ intlazy; in......
  • 算法与数据结构——二分查找
    二分查找二分查找(binarysearch)是一种基于分治策略的高效搜索算法。它利用数据的有序性,每轮缩小一半搜索范围,直至找到目标元素或搜索区间为空为止。Qustion:给定一个长度为n的数组nums,元素按从小到大的顺序排列且不重复。请查找并返回元素target在该数组中的索引。若数组不包含......
  • 二分
    二分答案要对一个有单调性的区间二分查找:|可行||不可行|,即某个点的一个方向全可行,另一个方向全不可行,要找这个点。(大部分时候求谁就二分谁,但也有例外,例外:http://noip.ybtoj.com.cn/contest/868/problem/8)更概括的,一段区间被一个点分成两种状态或特性经典题型最大值最小/最小......
  • LeetCode 704.二分查找 (java)
    给定一个 n 个元素有序的(升序)整型数组 nums和一个目标值 target ,写一个函数搜索 nums 中的target,如果目标值存在返回下标,否则返回-1。示例1:输入:nums=[-1,0,3,5,9,12],target=9输出:4解释:9出现在nums中并且下标为4示例 2:......
  • 【Python】排序算法及二叉树讲解(冒泡 选择 插入 二分查找 二叉树的广度优先和三种深
    排序算法​所谓排序,使一串记录,按照其中的某个或某些关键字的大小,递增或递减的排列起来的操作​排序算法,就是如何使得记录按照要求排列的方法​排序算法在很多领域是非常重要​在大量数据的处理方面:一个优秀的算法可以节省大量的资源。​在各个领域中考虑到数据的......
  • WQS 二分学习笔记
    1.股票买卖问题1.11.0版本考虑现在有\(n\)天,每天的股票价格\(a_i\)已知。你手上同时只能持有至多一张股票,且一笔买卖需要支付\(c\)的手续费。求最大收益。1.1.1解法1:DP我们不妨设\(f(i,0/1)\)表示前\(i\)天结束后手上是否持有股票。转移非常简单:\[f(i,0)=\m......
  • 704. 二分查找
    题目链接704.二分查找思路二分法题解链接二分查找总是写不对?一个视频讲透!(Python/Java/C++/Go)关键点循环不变量(开区间):nums[left]<target&&nums[right]>=target时间复杂度\(O(\logn)\)空间复杂度\(O(1)\)代码实现:classSolution:defse......