P4597 序列 sequence 题解

题面

题意

给定一个序列,每次操作可以把某个数 \(+1\)\(−1\)。要求把序列变成非降数列。

\(n\le5\times10^5\)\(|a_i|\le10^9\)

考虑一种 \(dp\) 做法,设 \(f_{i,j}\) 为考虑前 \(i\) 个数,第 \(i\) 个数取值为 \(j\) 时的最小代价。

有转移 \(f_{i,j}=\min{\sum_{k=1}^{j}f_{i-1,k}+|a_i-j|}\)

设 值域为 \(m\)

通过前缀 \(\min\) 可以 \(O(nm)\) 得到。

重点

考虑优化,\(dp\) 拍到坐标系中,从绝对值下手,考虑加入一个绝对值函数,再做前缀和。

按绝对值分讨,\(a_i\) 左边线段相当于斜率 \(-1\),右边线段相当于斜率 \(+1\)

加上前缀 min,显然满足单调不升,维护一个下凸壳。最后在判断最后面的斜率大于 \(0\) 的删去(翘起被前缀min删去)。

posted @ 2024-03-13 11:18  point_fish  阅读(75)  评论(0)    收藏  举报