Loading

7.5 CW 模拟赛 T3. 能量

前言

心态
策略: \(30\)
停滞不超过 \(15\)

数据检验, 关键步记录, 时刻简化

思路

首先考虑排序方法
对于赚钱的部分, 显然按照 \(a\) 排序
对于损失的部分, 考虑记这一部分为 \(a_{1, 2, \cdots, k}, b_{1, 2, \cdots, k}\), 记 \(f_i\) 表示从第 \(i\) 个开始需要的起始资金
不难有

\[f_i \gets \max\{a_i, f_{i + 1} + a_i - b_i\} \]

这种问题是很经典的, 考虑交换相邻元素法
考虑 \(\{a_1, b_1\}, \{a_2, b_2\}, f_k\)
那么按照 \(\{a_1, b_1\}, \{a_2, b_2\}, f_k\) 的顺序, \(f_1 = \max \{\max(f_k + a_2 - b_2, a_2) + a_1 - b_1, a_1\}\)
按照 \(\{a_2, b_2\}, \{a_1, b_1\}, f_k\) 的顺序, \(f_1 = \max \{\max(f_k + a_1 - b_1, a_1) + a_2 - b_2, a_2\}\)

进一步拆分

\[ \begin{align} f_{1 \gets 2} = \max \{\overbrace{f_k + a_2 - b_2 + a_1 - b_1}^{\textrm{same item}}, a_2 + a_1 - b_1, a_1\} \\ f_{2 \gets 1} = \max \{f_k + a_1 - b_1 + a_2 - b_2, a_1 + a_2 - b_2, a_2\} \end{align} \]

因此我们根据后两项对序列排序即可

现在引入选 \(k\)
先对序列排序, 直接引入一维记录已经选了多少个即可

还有一档全是赚钱的, 只需要贪心选择前 \(k\) 个即可

一档部分赚钱部分损失, 损失部分不超过 \(1000\) 个, 拆成两部分选择即可
如何合并?
\(g_i\) 表示选择 \(i\) 个赚钱的最小初始能源, \(h_i\) 表示选择 \(i\) 个赚钱的最终增量
那么合并即为 \(ans_k \gets \min\limits_{i + j = k} \{\max (g_i, f_{p, j} - h_i)\}\)
先算 \(g_i \geq f_{p, j} - h_i\) 的情况, 枚举 \(g_i\), 找到满足这个条件的最大 \(j\), 那么 \(ans_{i \sim i + j}\) 都可以更新
再算 \(g_i < f_{p, j} - h_i\) 的情况, 枚举 \(j\), 找到满足这个条件的最大 \(i\), 那么 \(ans_{j \sim i + j}\) 都可以更新

这样就做完了, 打下代码
注意更新用线段树维护两类贡献即可

总结

多个 \(\max\) 嵌套, 考虑把所有可能得到的情况考虑进去取 \(\max\)

确定顺序使得某个值取到最小的问题, 考虑交换相邻元素法
最终可以确定顺序

最后的合并属于一种贡献类问题, 属于特殊的处理方法

posted @ 2025-07-07 20:45  Yorg  阅读(7)  评论(0)    收藏  举报