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\) 的前缀和。
前面的表示第 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)\)。

浙公网安备 33010602011771号