CF1648D

题目大意:

有三行 \(n\) 列的矩阵,每个位置有个权值。
你要从 (1,1)->(3,n),你只能向下/右走。
初始第 2 行的位置不能经过。
\(m\) 个可选择的操作:每次将 \(l,r,c\),表示你花 \(c\) 的代价,可以经过第 2 行 \(l \sim r\) 的位置。
求最大价值。
\(n,m \le 5 \times 10^5\)

解题思路:

对第一行做一个前缀和,第三行做一个后缀和。
\(dp_{i}\) 表示强行让 (2,i) 变为最后一个可走的位置的最大价值。
但最优策略不一定是走到能走的最后面。
所以需要改状态。
改为 \(dp_{i}\) 表示走到 (2,i) 的最大价值。
那么从 \(q\) 次操作中枚举 \(l,r\) 表示让 \(l \sim r\) 能走的操作,要保证 \(l \le i \le r\)
预处理出第二行 \(a\) 的前缀和。

\[dp_{i} = max_{l \le i \le r}(dp_{l - 1} - cost + sum_{2,i} - sum_{2, l - 1}, max_{l \le j \le i}(sum_{1,j} + sum_{2,i} - sum_{2, j - 1} - cost)) \]

前面的表示第 2 行走到 \(l-1\) 以前,后面的表示第 2 行不再往 \(l - 1\) 走了。
由于前面的是个定值,线段树很好优化。
难在后面的部分。
因为后面的与 i 前面的 dp 值无关,所以可以对于每个 i,先求后面的式子。
那么变成了 \(l \le j \le i \le r\),求最大的 \(sum_{1,j} + sum_{2,i} - sum_{2, j - 1} - cost\)
套路的,为了消掉 \(i \le r\) 的限制,使用扫描线从前往后扫。
问题转化为有两个 \(A,B\) 数组,每次给定一个 \(i\),求 \(max_{1 \le x \le i} A_{x} + B_{x}\)
线段树维护时维护答案,\(maxA\)\(maxB\)即可。
pushup 时答案为 \(max(ans_{lson}, ans_{rson}, maxA_{lson} + maxB_{rson})\)
其中 \(-cost\) 对应 \(A_{l}\)\(sum_{1, j} - sum_{2, j - 1}\) 对应 \(B_{j}\)\(sum_{2, i}\) 是最后加的。
那么就可以 \(O(n \log n)\) 求出。
前面的也是个朴素的线段树优化 dp,只不过是从前往后扫。
时间复杂度 \(O(n \log n)\)

posted @ 2025-04-04 21:27  positive_deviation  阅读(20)  评论(0)    收藏  举报