Loading

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\) 做处理即可
以后遇到这类开头结尾定的问题, 一定要更细致的思考

数学语言表述问题是重要的

posted @ 2025-01-09 17:39  Yorg  阅读(11)  评论(0)    收藏  举报