CF940E Cashback

发布时间 2023-07-20 17:33:51作者: Ender_32k

首先我们发现在删的数的数量相等的情况下,尽量细分是不劣的。

所以我们可以假设每一段长度至多为 \(c\),同时长度严格 \(<c\) 的段都不会删数。

然后略加转换,最小化剩下的数的和相当于计算最大化删去的数的和。

由于长度严格 \(<c\) 的段都没有贡献,我们可以尽量分长度为 \(c\) 的段。

于是我们可以用单调队列预处理出 \(b_i\) 表示 \(a_i\)\(a_{i+c-1}\) 中的最小值,问题就变成了在 \(b\) 数组中取出若干个数,任意两个的距离不能 \(\le c\),求取出的数的和的最大值。

那就做完了,令 \(f_i\) 表示取到 \(i\) 的最大值,转移分几种取/不取几种情况讨论一下就好了。

  • 如果不取 \(i\)\(f_i\gets f_{i-1}\)
  • 如果取 \(i\)\(f_i\gets b_i+f_{i-c}[i>c]\)

复杂度 \(O(n)\)

评测记录。