凸优化 DP:k-子段和 系列问题
给定长度
问题 1:给定固定的
问题 2:支持两种操作,全局加和查询区间最大子段和,允许离线。
问题 3:对
问题 4:询问
问题 1
法一:使用 WQS 二分。
法二:模拟费用流。线段树支持查询最大子段和即可。复杂度
问题 2
本题即 P5073 世上最幸福的女孩
离线操作。把全局加
考虑用线段树处理这个问题。最大子段和总共需要四个信息:最大前缀和、最大后缀和、区间总和、最大子段和。
-
区间总和。这是好求的,对于参数
,其区间总和是 。 -
最大后缀和。这和最大前缀和类似。
-
最大前缀和。
先考虑对一个结点怎么求。
在结点
上,用 表示 有一个长度 的前缀,其和为 ,则对于 ,最大前缀和就是 ,容易发现这只会取到 的上凸壳。如果能预先求出上凸壳,就可以二分求最大前缀了。怎么求上凸壳?先求左右儿子的上凸壳,给右边的凸壳向上平移左边的总和(这显然还是个凸壳),然后利用闵可夫斯基和线性合并。一共
层,每层都是线性合并,预处理凸壳复杂度 。现在知道怎么对于一个结点求它的最大前缀和了,多个结点时按顺序合并即可。
-
最大子段和。
有了前后缀,最大子段和也很简单了。先递归左右儿子,先取左右儿子的最大子段和,然后用左儿子的最大后缀和右儿子的最大前缀拼起来。
把询问区间拆成
但如果这样子做是
但是这样做还是通过不了本题。因为空间复杂度是
但这给了我们启发,我们直接带着所有询问向下递归,判断该询问在该区间是否生效,是否下放到左右儿子即可(下放后要释放空间或是直接使用单链表移过去下放!),这样每个时刻每个询问至多只会在两个节点上。空间复杂度
问题 3
法 0.5:WQS 二分。复杂度
法一:模拟费用流。复杂度
法二:凸优化 DP。
闵和、凸优化常和分治/区间 DP 搭配,因为凸壳合并可以线性,分治
显然
问题 4
先考虑一个查询
然后沿用问题 2 的思路,在线段树上做这个问题。
考虑在一个线段树结点上怎么快速求答案。我们发现可以再利用问题 3 的想法:在每个线段树结点上记录这个结点对应的
然后对于一次询问
既然段数是个棘手的限制,我们就想办法去掉它。在问题 1 里也有段数限制,是用 wqs 二分解决的。所以在这里我们也 wqs 二分,这样就可以每个线段树结点内各自取若干段了。复杂度
如果允许离线,还能更快!使用整体二分,即 wqs 二分时把当前位置的询问分成两半各自传给下面,可以少一个
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!