线段树专题
线段树专题
注意:此文乃个人对线段树的见解,各位大佬如发现错误请批评指正
什么是线段树
线段树顾名思义,就是将一个数列的各个区间当成是树上的节点并维护。
线段树用来干什么
一般用来进行区间查改(矩阵查改本蒟蒻不会)
线段树节点如何编号
假设当前节点的编号为 \(k\),左儿子的编号为 \(2k\),右儿子的为 \(2k+1\)
[T1 区间加,求区间和](P3372 [模板]线段树 1 - 洛谷 | 计算机科学教育新生态 (luogu.com.cn))
这道题我们执行两个操作
1 x y k
表示将 \([x,y]\) 这个区间的所有值加上 \(k\)2 x y
表示求 \([x,y]\) 内每个数的和
先考虑线段树中要维护什么
上传答案
\(\text{pushup}:\)就是我们已经把左儿子(左区间)和右儿子(右区间)都做好了去更新
\(\text{ls}\) 表示做儿子编号,即为\(2k\),\(\text{rs}\) 同理
\(\text{build}:\) 首先,根节点所代表的区间为 \([1,n]\) ,我们在这里进入函数,然后先记录线段树节点的基本信息,然后建立左右子树,这里注意如果递归到叶子节点要回溯,最后上传。
\(\text{pushdown}:\) 下传懒标记,就是将上面大区间更改的值,下传到小区间进行修改
这个直接看代码和注释理解吧
\(\text{update}:\) 区间加
如果完全包含在要加的区间内,就直接加,如果不包含就先下传,然后如果左儿子又包含就递归左儿子,如果右儿子有包含就递归右儿子,注意最后上传
\(\text{query}:\) 区间查询
如果完全包含就返回当前区间的答案,否则先下传,然后如果左边又包含就加上左子树的答案,右边有包含就加上右子树的答案
然后这道题就结束了。
T2 区间加,区间乘,求区间和
三个操作
1 x y k
将 \([x,y]\) 这个区间的所有值乘 \(k\)2 x y k
将 \([x, y]\) 这个区间的所有值加 \(k\)3 x y
求 \([x,y]\) 区间和模 \(m\) 的结果
线段树维护的信息
上传答案与上面一样
\(\text{build}\) 建树
\(\text{pushdown}\) 下传懒标记
\(\text{update}\) 区间修改
\(\text{query}\) 区间查询
ok,又AC了一题
看到这里的可以先做一个习题
[公园遛狗](C. [例题3]公园遛狗 - 「数据结构」第4章 线段树 - 算法高效进阶2023 - 课程 - YbtOJ)
不会可以看[题解](C. [例题3]公园遛狗 - ljfyyds - 博客园 (cnblogs.com))
T3 种地收益(线段树优化 \(\text{dp}\))
这个就上难度了
考虑 \(dp\)
状态表示 \(f_i\) 表示 \(i\) 左侧都是可以给你带来收益的地(包含 \(i\) ) 所能带来的最大收益
设 \(s_i\) 表示将前 \(i\) 个地变成不荒地的代价,\(g_i\) 表示前 \(i\) 个 \(f\) 值的最大值 $g_i=\max{f_k}(0≤k≤i) $ \(cost(i,j)\) 表示 \([i,j]\) 区间能获得的收益。
状态转移方程 \(f_i=\max\{g_j-(s_i-s_j)+cost(j+1,i)\}(0≤j<i)\)
意思就是 \(j\) 之前的最好答案减去将 \(j+1 \sim i\) 变成不是荒地的代价加上获得的收益
这个算法要枚举 \(i\) 和 \(j\) ,时间复杂度为 \(O(n^2)\) 显然过不了
首先我们发现在 \(j\) 的枚举过程中 \(s_i\) 永远都是不变的,所以原式子变为
我们用线段树维护 \(g_j + s_j + cost(j+1,i)\) 的最大值
\(g_j+s_j\) 定下来不管 \(i\) 怎么往右移动都不会变了,所以变的只有 \(cost(j+1,i)\) 这一项
什么时候 \(cost\) 值会增加
我们发现只有新添加一个新的区间时答案会增加,这个时候 \(i\) 等于某个 \(r_k\)
右端点固定是 \(i\) 那么需要修改的区间只有左端点小于 \(l_k\) ,所以我们把 \([0,l)\) 的区间加上收益 \(p_k\) 区间加
然后计算用区间查找 \(g_j+s_j\) ,最后单点修改 \(i\) 这个位置
答案为 \(g_n\)
__EOF__

本文链接:https://www.cnblogs.com/ljfyyds/p/17675670.html
关于博主:评论和私信会在第一时间回复。或者直接私信我。
版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
声援博主:如果您觉得文章对您有帮助,可以点击文章右下角【推荐】一下。您的鼓励是博主的最大动力!
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· DeepSeek “源神”启动!「GitHub 热点速览」
· 我与微信审核的“相爱相杀”看个人小程序副业
· 微软正式发布.NET 10 Preview 1:开启下一代开发框架新篇章
· 如何使用 Uni-app 实现视频聊天(源码,支持安卓、iOS)
· C# 集成 DeepSeek 模型实现 AI 私有化(本地部署与 API 调用教程)