CF940E Cashback
首先我们发现在删的数的数量相等的情况下,尽量细分是不劣的。
所以我们可以假设每一段长度至多为 \(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)\)。