1.9 CW 模拟赛 T2. array
思路
简单的考虑梦梦的决策点为 \(k\) 时, 如何使最大子段和最大化
容易想到以下的分类讨论
- 完全在 \([1, 2k - 2] \cup [2k + 1, 2n]\) 中
- 包含 \(C_{2k - 1}, C_{2k}\) 中的任意一个
- 包含 \(C_{2k - 1}, C_{2k}\)
考试的时候想到了这里, 问题在于如何高效的解决计算这 \(3\) 种情况
首先解决最大子段和应该如何计算
考虑一般的最大子段和的计算方式, 令 \(l_i\) 表示以 \(i\) 结尾时的最大子段和
\[l_i = \max(a_i, l_{i - 1} + a_i)
\]
因为对于 \(a_{2i - 1}, a_{2i}\) 是可以随意交换的, 我们考虑修改转移
\[\begin{cases}
\begin{align*}
l_{2i - 1} & \gets \max\{ 0, \max(A_i, B_i) + l_{2i - 2} \} \\
l_{2i} & \gets \max\{ 0, A_i + B_i + l_{2i - 2}, A_i, B_i \}
\end{align*}
\end{cases}
\]
容易发现如果求以 \(i\) 为开头的最大子段和, 记为 \(r_i\) , 同理转移即可
考虑答案的计算
完全在 \([1, 2k - 2] \cup [2k + 1, 2n]\) 中
由 \(l_i, r_i\) 可以直接得出
包含 \(C_{2k - 1}, C_{2k}\) 中的任意一个
分类讨论
- \(C_{2k - 1} = \max(A_k, B_k) , C_{2k} = \min(A_k, B_k)\)
此时的答案 \(res = \max(l_{2k - 2} + C_{2k - 1}, r_{2k + 1} + C_{2k})\) - \(C_{2k} = \max(A_k, B_k) , C_{2k - 1} = \min(A_k, B_k)\)
此时的答案 \(res = \max(l_{2k - 2} + C_{2k}, r_{2k + 1} + C_{2k - 1})\)
简单取 \(\min\) 即可
包含 \(C_{2k - 1}, C_{2k}\)
简单, 此时的答案 \(res = l_{2k - 2} + C_{2k} + C_{2k - 1} + r_{2k + 1}\)
不同方法得出的答案取 \(\max\) , 不同位置得出的答案取 \(\min\) 即可
总结
对于这种分成一段一段的问题, 考虑整体一点的处理
这种求 \(\forall i \in [1, n]\) 的问题, 都可以简单的进行全局预处理, 而预处理的东西才是需要思考的
一般来说, 直接用前后缀来处理是简单的
一个赛时没转过弯的地方: 对于 \([1, 2k - 2] \cup [2k + 1, 2n]\) 中最大子段和的计算, 简单的对 \(l_i, r_i\) 做处理即可
以后遇到这类开头结尾定的问题, 一定要更细致的思考
数学语言表述问题是重要的

浙公网安备 33010602011771号