Slope Trick 小记
参考资料:
定义
Slope Trick 是一类具有凸性的最优化 DP 的优化手段,其具有效率高,空间小,易于操作等优点。
对于 Slope Trick 而言,其实现方式较为灵活,取决于题目 凸壳 特点,维护出足以还原整个凸壳/有用部分 的信息,进而根据最优值斜率为零的特点进行操作。
使用 Slope Trick 的 DP 常(并非全部)有如下特点:
- 最优化,有凸性
- 是连续的一次分段函数
- 其斜率变化量是整数,且总变化量不大
一般使用如下信息维护凸壳(并非绝对,具体分析)
-
记录凸壳的起始点
-
记录斜率变化点的
坐标(仅需 坐标,是可重集合,一般存储一个表示斜率变化 (根据上下凸壳是 )),如 存储当斜率变化量相当大的时候也可以维护
表示到 的时斜率变化了
可并堆由于可以快速合并两个凸壳是极为常用的数据结构,而平衡树由于其堆性质和优秀的扩展性也较为常用。
两个凸函数相加仍然是凸函数。
有一些常见的操作:
-
合并两个凸壳
直接合并起始点,然后合并斜率变化点集合
-
找最值
找到斜率为零的那一段
有一类常见的方法就是开两个堆
维护 段左右侧的变化点。 -
加一次函数
直接加入斜率变化点(根据一次函数的边界),同时维护起始位置
-
平移
整体打标记
-
翻转
利用平衡树维护,打标记
统计答案:
- 还原图像找到对应点坐标
- 记录决策点位置还原整个DP过程
平时思考也可以考虑固定点(最左侧最右侧或者最小值点)反推整个图像变化
习题集
这里更多着墨于 Slope Trick 部分,对于 dp 式的得出可能较为简略
CF713C
首先令
由于
考虑到
所以可以维护最小值位置
此时 成为新的最小值点(由 最大的转折点往前推斜率),所以第二个 应当删去 此时 后面(包括了 )其斜率会增加 ,这也将导致 点真实斜率增大,应当删去 ,同时整个图像( 后面点)整体向上平移了 的长度(可以看作改变后 这个位置也位于新的零段上面, 这全部斜率都增加了 )
CF1534G
首先转曼哈顿,这样就变成了坐标差绝对值的和,然后你每次
显然对于
对于后半部分的式子,在凸壳上其实相当于将最小值点左侧向左,右侧向右平移
于是可以利用一个大根堆
每次我们讨论
-
位于斜率为零的段上左侧斜率变化,右侧斜率变化,
里都插入 (注意懒标记是全局的) -
位于斜率为负的段上这时候
里最大的点移动到正段,也就是 里加入 的最大值,同时后面的图像也向上平移了那么多,增加答案 -
位于斜率为正的段上类似上一情况处理即可。
校内模拟赛(13)-蛋糕
很自然地转化相对关系为往右走或者往上走,则可以得到一个 dp 式
有转移:
其中
注意到也可以写作:
首先可以注意到
感性理解其实挺简单的。
那么可以考虑这个操作在干嘛,先分析
至于
这样的话,其实也可以当作是原本(插入
动态维护当前的
同时我们让
APIO2016 烟火表演
容易写出朴素DP式,也就是
发现绝对值函数是凸的,所以叶子的
然后我们考虑一个绝对值函数有什么影响。
由于我们关心最小值,所以我们只关心斜率为
不难发现假设原本段是
我们只关心最小值,所以我们只需要维护半个凸壳,也就是
那么我们可以忽略
其实是简单的,有
(我们并没有管它,但是它合并上来后会形成拐点)
发现我们只需要维护凸壳上点的横坐标,维护即可。
也即使用一个可并堆(大根堆删后面),依次合并儿子,然后弹出前面的
这里注意对于叶子节点而言,即使这是一个点也要看成一段,这是
CF280E
有教育意义的 Slope Trick。
首先我们可以通过平移将
那么容易有
这里唯一的问题就是第二维太大了,我们考虑维护函数图像。
考虑到
其实我们仍然可以维护二次分段函数,二次函数的平移与求最值也是能够算出的。
所以我们维护这个二次分段函数。
这里就相当于原本最值所在的二次函数在最值所在位置分裂成两个,然后插入一条水平线段,可以
每次找到最值位置,就可以求出
ABC217H
显然建立
显然离开子树后子树都是整体操作的
有
显然可以优化为:
现在我们做到了
换个写法:
当合并时这个形式感觉由于
容易发现由于
首先假定成立,则设
相当于把
那么在原本的斜率递增的情况下会删除一个尾巴/脑袋,还是递增的。
而且至多有
考虑用数据结构维护斜率,然后每次删除增加,我们需要启发式合并?。
不妨维护
讲讲实现(谁再喷我水):
维护
然后维护
(可以看作是三个凸包,
然后我们将斜率小于零的部分以及初始位置小于
接着我们插入
注意到我们只需要维护这些二元组的快速合并和查首项,用可并堆(左偏树)即可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!