loading

slope trick

这个有思维含量的东西真的是我能学会的?????

CF13C/P4597 序列 sequence

列出暴力转移式子 \(f_{i,j}=\min_{k\le j}f_{i-1,k}+\left|a_i-j\right|\),由于绝对值是凸函数,\(f_i\) 又可以看成对 \(f_{i-1}\) 前缀取 min 后加一个凸函数,归纳一下就可以证明 \(f_i\) 的凸性(前缀取 min 相当于与全 0 序列做 min+ 卷积)。

一种维护方法是维护所有拐点,插入一个拐点表示图像要在拐点处斜率 +1(重复出现几次就加几)。由于 \(f_i\) 可以看成若干个凸函数相加,所以维护拐点就相当于维护 \(f_i\) 图像,而初始斜率就是 \(-i\)。由于绝对值会在 \(a_i\) 处斜率 +2,所以插入两个 \(a_i\)。由于要前缀取 min,所以所有斜率 \(>0\) 的部分都会 \(=0\),而此时拐点集合内有 \(i+1\) 个元素,只需要删除最后一个拐点即可。这样需要支持插入和弹出最大值,大根堆维护即可。

posted @ 2025-10-14 20:22  dcytrl  阅读(7)  评论(0)    收藏  举报