GZOI2024 Day1 T2 card
GZOI2024 Day1 T2 card
首先最后一张牌可能不会弃满 \(b_i\) 张牌。而如果我们要打出若干张牌,肯定想要最后打出 \(b_i\) 最大的那张牌,这样显然更划算。因此要先按照 \(b_i\) 排序。
首先很容易想到背包。把同类牌拆成 \(c_i\) 个,然后直接背包:\(f_{i,j}\) 表示遍历到第 \(i\) 张牌,一共用了 \(j\) 张牌(包括打出去的和弃掉的),的最大价值。显然这样会超时。因为牌的数量太多了。这样背包感觉没有什么优化的前途。
考虑不把同类牌拆开。那么在第 \(i\) 类牌转移时就需要枚举打出几张这类牌。考虑如何优化。
于是我们要寻找最优决策点 \(k\)。
感觉这个东西看起来很能斜率优化。
(以下计算省略 \(i\) 这一维,以及所有 \(b_i\) 默认加 \(1\))
设 \(x<y\),若 \(f_{j-bx}+cx<f_{j-by}+cy\)。
这东西,\(f\) 的下标不等于 \(x,y\),是做不了斜优的,不行你试试看。
所以我们设 \(x'=j-bx,y'=j-by\),则 \(x=\frac{x'-j}{b},y=\frac{y'-j}{b}\)。
以下省略 '
。
设 \(x<y\),若
注意,由于 \(x=j-bx,y=j-by\),所以 $x,y\equiv j(\bmod b) $。所以要把 \(f\) 分成 \(b\) 个部分分别计算。
因为我们是枚举 \(i\),然后枚举 \(j\) 计算 \(f_j\) 的,因此 \(b,c\) 看作常数。要求的斜率固定,可以开 \(b\) 个单调队列维护最优决策点。决策点可以 \(O(1)\) 找出,时间复杂度是 \(O(n\sum c)\),时限 \(4s\),可以通过此题。由于 \(f_{i,j}\) 的 \(i\) 这一维可以循环利用空间优化掉,所以空间是 \(O(\sum c)\) 的。单调队列空间是 \(O(n)\) 或者 \(O(nb)\) 的,反正 \(b=500\),都能过。
本文来自博客园,作者:liyixin,转载请注明原文链接:https://www.cnblogs.com/liyixin0514/p/18404357