Description
题目链接:SPOJ 1716
维护一个长度为 $n$ 的序列 $A$,进行 $m$ 次询问或操作:
0 x y
:将 $A_x$ 单调修改为 $y$1 x y
:求出 $\max\{\sum_{k=i}^j A_k\}(x\le i\le j\le y)$。
数据范围:$N,M\le 5\times 10^4$,$|A_i|\le 10^4$
Solution
首先分析询问的本质:求出区间最大子段和!
很显然我们可以使用线段树维护序列,本题的难点主要在如何进行上传操作,即$\text{push up}$。
将子树 $l$ 和 $r$ 的节点信息上传到子树 $rt$ 时,对于 $rt$ 维护的序列中,和最大的子段有两种情况:
子段不经过中点,那么 $rt$ 的答案为 $l$ 和 $r$ 的答案的最大值。
子段经过了中点。这种情况比较复杂,因为我们无法知道子树的答案所对应的序列。这也是本题的难点所在。
接下来对第 $2$ 种情况进行重点分析:
我们记 $res$ 为区间最长子段和,$sum$ 为区间和,$prel$ 和 $prer$ 分别表示从区间左端点和右端点开始的最大子段和。
考虑这些信息如何上传:$sum$ 可以直接上传,$prel[rt]=\max(prel[l],sum[l]+prel[r])$($prer$ 同理),$res[rt]=\max(res[l],res[r],prer[l]+prel[r])$
时间复杂度:$O(m\log n)$
Code
1 |
|