这个之前学过的,结果我发现我忘了,怕之后再忘,我就再写一下吧。毕竟这个东西非常有用(好写)可以代替cdq/平衡树+斜率优化,来优化dp
流程
数据结构本质是一棵线段树,每个节点都储存了。
表示覆盖该点范围的在处取最值的线段。
你会想:维护这个有什么用?每个点就只能维护一个,复杂度和正确性怎么保证?
便于理解,就直接讲操作了。
加入(一条线段)
从根遍历线段树。令表示自变量为在线段上取值。假如这里的最值是。
- 如果,结束。
- 如果,更新,不过我们做的是此时原来的就替换了(处于待加入状态)。
- 接下来虽然在中点处不如,但在两端处可不一定,但是我们发现了一个可以保证复杂度的性质:至多在左或右的一端优于(像一个跷跷板...)。
这样在哪边优就往哪边继续递归。当然如果左右两端(整条线段劣于,自然就结束了) - 最后在叶子时,发现保存的恰好是取值最优线段。结束。
- 复杂度:划分为个区间后,每个区间都有可能执行到叶子
特别的:加入直线是因为没有划分区间的过程了。
查询
- 单点查询直接从上一直到叶子或取每个点的值更新。
- 如果是区间查,就需要存一个变量表示子树最值,加入时P_up()即可维护。
应用 (都是优化dp的,不想特别去讲了)
[HEOI2013]Segment
「NOI2007」货币兑换
外层套树链剖分:[SDOI2016]游戏
又是sdoi: [SDOI2012]基站建设
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 震惊!C++程序真的从main开始吗?99%的程序员都答错了
· winform 绘制太阳,地球,月球 运作规律
· 【硬核科普】Trae如何「偷看」你的代码?零基础破解AI编程运行原理
· 上周热点回顾(3.3-3.9)
· 超详细:普通电脑也行Windows部署deepseek R1训练数据并当服务器共享给他人
2021-07-12 转存【矩阵快速幂】