原题链接
1 题目
1.1 题目所需求出内容
对于本题,最终要求:一个最大值
1.2 题目背景、允许、禁止与限制
背景:
有 nnn 个公园,每个公园 iii 有初始分数 aia_iai ,接下来要进行 mmm 次操作
允许:
对于每次操作,有两种可能:
* 给出两个数 xxx 和 yyy,代表公园编号区间 [x,y][x,y][x,y],求这段区间内的最大连续子段和
* 给出两个数 ppp 和 sss,代表将公园 ppp 的分数设置为 sss
限制:
每个公园的分数有可能是负数
1.3 题目数据范围与猜测
1≤n≤5×105⟶O(n log n)1 \le n \le 5\times10^5 \longrightarrow O(n~log~n)1≤n≤5×105⟶O(n log n)
1.4 一句话概括题意
有一些公园,每个公园有初始分数,对于每次操作,如果是设置则无需任何输出,如果是查询则输出特定区间内的最大连续子段和
2 题目破题推导
2.1 大拆小,小组大
还是以区间 [l,r][l,r][l,r] 为例
我们只需要记录 444 个信息(这些信息并不是提前想出的,而是边扩展的过程中边考虑增加信息的记录,你会发现我们提到的这些信息都是在维护答案的过程中都会用到的)
* 区间最大连续子段和
* 区间包含左端点的最大连续子段和
* 区间包含右端点的最大连续子段和
* 区间总和
那如何维护这四项呢?
> 注:这里的左区间是指 m=l+r2m=\frac{l+r}{2}m=2l+r 时的区间 [l,m][l, m][l,m],右区间是指 m=l+r2m=\frac{l+r}{2}m=2l+r 时的区间 [m+1,r][m+1, r][m+1,r]
* 区间最大连续子段和有三种可能
第一种是左区间最大连续子段和
第二种是右区间最大连续子段和
第三种是左区间包含右端点的最大连续子段和与右区间包含左端点的最大连续子段和拼接而成
* 区间包含左端点的最大连续子段和有两种可能
第一种是左区间包含左端点的最大连续子段和
第二种是左区间总和与右区间包含左端点的最大连续子段和拼接而成
* 区间包含右端点的最大连续子段和有两种可能
第一种是右区间包含右端点的最大连续子段和
第二种是右区间总和与左区间包含右端点的最大连续子段和拼接而成
* 区间总和
就是左区间总和 +++ 右区间总和
3 模型匹配
> 格式为:"关键词:...... ⟶\longrightarrow⟶ ......\huge{......}......"
关键词:单点修改,区间查询 ⟶\longrightarrow⟶ 线段树\huge{线段树}线段树
注意这题因为不能保证线段树上一定有如 [2,3][2,3][2,3] 的区间,因此需要新建一个临时结构体用于记录合并,并向上传递答案,最终返回具体值
4 最终代码(禁止抄袭,仅用于参考)