关于 wqs 二分的一言两语

news/2025/1/15 14:37:11/文章来源:https://www.cnblogs.com/SFlyer/p/18412554

感觉一个比较入门的题目是 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\) 乘上二分出来的斜率。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/796642.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

Go runtime 调度器精讲(四):运行 main goroutine

原创文章,欢迎转载,转载请注明出处,谢谢。0. 前言 皇天不负有心人,终于我们到了运行 main goroutine 环节了。让我们走起来,看看一个 goroutine 到底是怎么运行的。 1. 运行 goroutine 稍微回顾下前面的内容,第一讲 Go 程序初始化,介绍了 Go 程序是怎么进入到 runtime 的…

Python网页应用开发神器Dash 2.18.1稳定版本来啦

本文示例代码已上传至我的Github仓库:https://github.com/CNFeffery/dash-master Gitee同步仓库地址:https://gitee.com/cnfeffery/dash-master大家好我是费老师,上周Dash发布了2.18.0新版本,并于今天发布了可稳定使用的2.18.1版本(自古.1版本最稳✌),今天的文章中就将针…

吊打面试官!从多维度理解架构

大家好,我是汤师爷~ 在工作当中,我们经常会听到以下说法:产品负责人说,现在的业务架构太复杂,需要仔细梳理下。 技术领导说,这个项目很复杂,需要做下系统架构方案评审。 研发经理说,这次秒杀活动访问量非常大,需要用到高并发架构方案。 一线研发说,互联网大厂都会用到…

数组的下标越界

1.数组下标 数组的下标通俗来讲是数组中数据的代号,例如a[0]=1,即数组下标0代表1 2.下标越界 假设创建的数组内存为3(a=new int[3]),则数组的下标为0,1,2. 如果多输出了下标3,则会显示下标越界。 1.正常数组的输出2.下标越界的输出(即提示你数组下标越界异常!) 3.数组…

转载:国产操作系统麒麟v10、UOS在线打开excel文件并动态赋值

在实际的开发过程中,经常会遇到数据库中的数据填充到excel生成一份正式文件的功能,PageOffice客户端控件支持在线预览Excel文件时,通过Workbook对象来实现对Excel文件的数据填充功能,如果只是简单的填充一下数据,那么通过调用Sheet对象的openCell方法获取到Cell对象并赋值…

构建 openEuler Embedded 24.03 LTS (Phytium BSP)

Ubuntu 24.04 构建 openEuler Embedded 24.03 LTS (Phytium BSP) 参考链接:Phytium-OpenEuler-Embedded-BSP - Gitee 1 介绍 本文档介绍如何在Ubuntu 24.04上构建openEuler Embedded 24.03 LTS (Phytium BSP)。对计算机配置有要求。 2 脚本 将以下内容复制到新文件oe_phy.sh,…

架构师备考的一些思考(四)

前言 对于数学,我们之前学的是对的,但不是真的,所以我们没有数学思维。 对于计算机,我们学校教的是对的,但不是真的,所以仅仅从学校学习知识的应届毕业生,不论985,211,本科,专科都一样,都是一张白纸,啥也不会。 案例分析 案例分析是5选3,第一题必答。问题一的类型 …

字符串-面试题

字符串的相关面试题String 的不可变性String底层是一个 final修饰的字符数组,当改变String的值时,会在常量池生成新的字符串,字符数组的地址指向常量池中新的字符串StringBuffer的扩容原理String、StringBuffer、StringBuilder三者对比Strings是不可变的字符序列,底层是一个…

单考一个OCP认证?还是OCP和OCM认证都要考?

​ Oracle的OCP认证是数据库行业非常经典的一个认证,从事数据库行业的人都建考一个 Oracle OCP 认证。 OCP认证内容包括: OCA部分:数据库基础知识、SQL 语言使用、基本的数据库管理技能等,如数据库安装与配置、理解数据库架构、管理数据库实例、备份和恢复,以及使用 SQL 进…

为什么那么多开源软件都用netty来做网络通信编程框架?

1、用netty来做网络通信编程框架而不是我们自己去基于JDK NIO来编程的好处有如下这些: (1)、netty支持常见的应用层协议(如:HTTP、FTP、DNS等),还可以支持自定义协议; (2)、netty可以自动解决网络编程当中的粘包与半包问题; (3)、netty还可以支持流量整形; (4)、netty对…

USB总线-Linux内核USB3.0设备控制器中断处理程序分析(九)

1.概述 USB设备枚举、请求处理、数据交互都涉及USB设备控制器中断。当有事件发生时,USB设备控制器首先将事件信息通过DMA写入到事件缓冲区中,然后向CPU发出中断,随后CPU调用中断处理函数开始处理中断事件。 2.事件 dwc3 USB设备控制器事件使用dwc3_event数据结构描述,由4个…

通义灵码企业代码补全增强使用实践

通义灵码提供了企业代码补全增强的能⼒,在开发者使⽤通义灵码 IDE 插件的⾏间代码补全时,可以结合企业上传的代码库作为上下⽂进⾏⾏间代码补全,使代码补全更加贴合企业代码规范、业务特点。本⽂将分享如何构建⾼质量的企业代码库,以及开发者在前端和后端开发场景的使⽤实践…