题解 P11630 [WC2025] 士兵
令我痛失牌子的题目。
Solution
来一种大众做法。
考虑 DP,令 \(f_{i,j}\) 为在前 \(i\) 个人中,第 \(i\) 个人打了 \(j\) 下的最大收益,转移只与 \(f_{i-1}\) 有关,这是简单的。进一步的,我们发现每一步的血量要么跟上一步相等,要么刚好更改这个人的状态(生死取反),即转移只用考虑 \(f_{i,a_i-1},f_{i,a_i}\),剩下的直接继承,当然还有一个后缀加贡献 \(b_i\) 的操作。
把 \(f\) 滚动一下,则有转移:
-
\[f_{a_i-1}\gets \max(f_{a_i-1},\max_{a_i\le j\le V}\set{f_j}) \]
-
\[f_{a_i}\gets \max(f_{a_i},\max_{0\le j\le a_i-1}\set{f_j-m\times(a_i-j)}) \]
-
\[f_j\gets f_j+b_i(j\ge a_i) \]
第二个变形一下就是
\[f_{a_i}\gets \max(f_{a_i},\max_{0\le j\le a_i-1}\set{f_j+mj}-ma_i)
\]
所以按 \(a_i,a_i-1\) 离散化一下,开两棵线段树,分别维护 \(f_i\) 和 \(f_i+mi\),转移就全部变成线段树的普通操作了。
AC 记录,码风很烂常数也很大。

浙公网安备 33010602011771号