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删去)。

浙公网安备 33010602011771号