【笔记】线段维护单调栈
【笔记】线段维护单调栈
维护单调栈的信息可以包括:
- 单调栈的大小;
- 单调栈里面元素的权值(可以和键值不一样)的极值/和。
1 核心思想
(以维护严格单增的单调栈为例,单减同理。
首先线段树内会维护区间最大值
定义一个函数:
那么
考虑怎么算
分讨一下:
-
区间长度为
:略; -
如果
: ; -
如果
:这样乍看上去好像并没有什么用,还是
的,但实际上变化就在于后面是 ,而不是 。相对于
, 可以视为定值,因为我们每次更新 的时候,就可以同步算出新的 ,然后储存到一个变量里面。
这样的话,我们就保证了
而每次 push_up
的时候都要调用一遍,所以总的时间复杂度就是
2 例题
2.1 楼房重建
因为固定了在
其实仔细想一下,我们并不是要求房子的高度单增,而是房子的斜率单增,然后就是板子了。
维护单调栈长度的板子。
2.2 「JOISC 2014 Day3」稻草人
注意一件事情,理论上,我们从前往后/从后往前做、单增/单减都是可以任意选取的。
但是如果 calc
算的是小于等于某个值构成的单调栈的话,就不能同时求出大于等于某个值的单调栈(?
为了规避掉这个问题,我们直接按照
分类:
数据结构 / 线段树
标签:
笔记
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· C#/.NET/.NET Core优秀项目和框架2025年2月简报
· Manus爆火,是硬核还是营销?
· 一文读懂知识蒸馏
· 终于写完轮子一部分:tcp代理 了,记录一下