首页 > 其他 > 详细

POJ3079 K-Anonymous Sequence (斜率优化)

时间:2020-12-02 00:13:55      阅读:30      评论:0      收藏:0      [点我收藏+]

题目链接:POJ3079 K-Anonymous Sequence
题目大意:

\(T\) 组数据,有一个长度为 \(N\) 的单调不下降的序列 \(A\) ,每一次操作可以将其中一个数字 \(A_i\) 减1,要求操作后的序列满足每个数字都存在至少 \(k-1\) 个元素和其大小相等,求操作数的最小值。
\(T\leq 20,2\leq N\leq 500000\)\(\forall A_i\in [0,500000]\)

思路:
\(dp[i]\) 为对于前 \(i\) 个数的最小值,\(sum[i]=\sum_{j=1}^i{a_i}\),显然将连续的一段 \(A_i\) 变为同一个值是较优的,首先可以得到 \(O(n^2)\) 的朴素DP:

\[dp[i]=\min_{0\leq j\leq i-k}\{dp[j]+sum[i]-sum[j]-(i-j)*a[j+1]\} \]

考虑优化,将与 \(j\) 无关的项移到外面,简单整理:

\[dp[i]=\min_{0\leq j<i}\{dp[j]-sum[j]+j*a[j+1]-i*a[j+1]\}+sum[i] \]

这里有 \(i*a[j+1]\) 的乘积式,可以斜率优化,将min去掉,移项后可以得到:

\[dp[j]+j*a[j+1]-sum[j]=i*a[j+1]+dp[i]-sum[i] \]

\(dp[j]+j*a[j+1]-sum[j]\) 作为纵坐标, \(a[j+1]\) 作为横坐标,由于后者和斜率 \(i\) 都是单调递增的,可以用单调队列直接维护凸壳,时间复杂度 \(O(n)\)

实现细节:

  • 这个数据范围显然要开long long。
  • 等到 \(dp[i]\) 要进行转移时再将 \(i-k\) 加入单调队列,否则本身要转移的最优状态可能会被后面加入但暂时不转移的状态淘汰掉。
  • \(2k\)\(dp\) 没有转移状态,应直接计算整体成块的答案。

Code:
技术分享图片

POJ3079 K-Anonymous Sequence (斜率优化)

原文:https://www.cnblogs.com/Neal-lee/p/14070846.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!