P10001
设第 \(i\) 个物品用了 \(x_i\) 张优惠券,记前 \(i\) 次操作后剩余优惠券数量为 \(s_i\),那么有
且 \(\forall i \in [1,n+1],x_i \le s_{i-1}\)。
考虑如何最大化手上优惠券的利用价值。
由题意,先使用前 \(a_i \bmod c\) 张优惠券,接下来再 \(c\) 张 \(c\) 张地使用,最后 \(<c\) 张一起用显然最优。先进行第一种用法,此时 \(x_i=\min(a_i \bmod c,b_i,s_{i-1})\),对于第二种用法,显然越靠后使用完优惠券的后效性越小,考虑从后往前贪心选尽可能大的 \(x_i\) 即可,此时第 \(i\) 个位置会使用
次 \(c\) 张优惠券。
最后考虑第三种用法,仍然考虑贪心,即选择性价比高的位置去操作,记 \(t_i=s_{i-1}-x_i\),则第 \(i\) 个位置可以用的最大数量就是 \(\min(t_i,b_i-x_i,\min_{j=i+1}^{n+1}(t_j-1))\)。
随后注意到 \(\ell_i=\min(t_i,\min_{j=i+1}^{n+1} (t_j-1))\) 单调不降,但是 \(b_i-x_i\) 并不具有单调性,所以我们考虑按照 \(b_i-x_i\) 进行排序,依次加入。对于一个可行集合 \(S\),每次加入若干个 \(b_i-x_i\) 相等的位置,去掉所有 \(\min(t_i,b_i-x_i,\min_{j=i+1}^{n+1}(t_j-1))\) 大于下一个最小的 \(b_i-x_i\) 的位置。
在根据 \(\ell_i\) 的单调性,能取的 \(i\) 就是 \(S\) 和一段后缀的交集,考虑用堆维护 \(S\),用线段树维护 \(t_i\),可以做到 \(O(n \log n)\)。

浙公网安备 33010602011771号