GZOI2024 Day1 T2 card

GZOI2024 Day1 T2 card

首先最后一张牌可能不会弃满 \(b_i\) 张牌。而如果我们要打出若干张牌,肯定想要最后打出 \(b_i\) 最大的那张牌,这样显然更划算。因此要先按照 \(b_i\) 排序。

首先很容易想到背包。把同类牌拆成 \(c_i\) 个,然后直接背包:\(f_{i,j}\) 表示遍历到第 \(i\) 张牌,一共用了 \(j\) 张牌(包括打出去的和弃掉的),的最大价值。显然这样会超时。因为牌的数量太多了。这样背包感觉没有什么优化的前途。

考虑不把同类牌拆开。那么在第 \(i\) 类牌转移时就需要枚举打出几张这类牌。考虑如何优化。

\[f_{i,j}=\max_{k=1}^{c_i}\{f_{i-1,j-(b_i+1)k}+c_ik\} \]

于是我们要寻找最优决策点 \(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\),若

\[f_x+c\frac{x-j}{b}<f_y+c\frac{y-j}{b}\\ -\frac{c}{b}(y-x)<f_y-f_x\\ -\frac{c}{b}<\frac{f_y-f_x}{y-x}\]

注意,由于 \(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\),都能过。

posted @ 2024-09-09 13:22  liyixin  阅读(34)  评论(0编辑  收藏  举报