线段树优化
概述
-
线段树优化通过线段树能快速区间取值和区间修改的特性,高效实现具有连续性的 dp 转移。
-
所谓的连续性可以是顺推的转移目标点为连续区间,也可以是逆推的转移出发点为连续区间,这一连续不一定必须是原数组下标这一维度上的。
-
效果一般为将 KD1D 的 dp 的
的转移优化至 ,转移大于 1D 的 dp 中线段树优化较为罕见。 -
应当指出的是,有些时候要刻意使用同构 dp 来方便进行线段树优化,譬如一个典型的手法是将“考虑了前
个,最后一个选的是 ”改成“考虑了前 个,最后一个选的是 ”,将状态的复杂度转嫁到转移上,然后使用线段树优化。
例题
CF1788E Sum Over Zero
-
题意略。赛时我可能智商欠费。
-
容易看出一个线段
合法当且仅当 。可以转换成 ,这里 是 perfix sum 的缩写。 -
故考虑设计如下 dp:
-
状态设计:
表示考虑了前 个点,当前最大合法总长度是多少。 -
初始化:
。 -
状态转移方程:
,其中后一个转移需要满足 。 -
不妨记
,显然可以预处理,稍微化一下式子(只考虑后一种转移),得到 。事实上因为前一种转移, 本身就具有 的性质,不过这里我们假装它没有。 -
注意到我们的转移顺序天然地保证了
,故我们可以开一棵值域线段树,树上第 个叶节点表示 。在得到 后将 扔到树上的第 个叶节点上,转移的时候只要做前缀询问就好了。 -
那其实应该也可以是树状数组,单点修改,前缀最大值...哦值域太大了啊。那么考虑将这一转移对偶,即我们就开关于下标的树,此时转移顺序变成按
从小到大了。哦错了,这会使得前一种转移不可行,于是炸了。
-
-
复杂度
。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧