题解 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 记录,码风很烂常数也很大。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 单线程的Redis速度为什么快?
· SQL Server 2025 AI相关能力初探
· AI编程工具终极对决:字节Trae VS Cursor,谁才是开发者新宠?
· 展开说说关于C#中ORM框架的用法!