问题描述:
给定一段长度为 n n n的序列 a 1 , a 2 , … , a n a_1,a_2,\dots,a_n a1?,a2?,…,an?( a a a有正亦有负),每次 询问 [ L , R ] [L,R] [L,R](即 a L a_L aL?~ a R a_R aR?)范围内的最大子段和,并涉及 单点修改 操作。
【线段树】 维护区间最大子段和:
①定义:
线段树一共要维护 4 4 4个值,如下:(每个值的含义都是相对于该结点对应区间 [ l , r ] [l,r] [l,r]而言)
struct node
{
int sum; //[l,r]区间之和int max_sum; //[l,r]内的最大子段和int max_pre; //[l,r]内的最大前缀和int max_post; //[l,r]内的最大后缀和
}t[maxn<<2];
②向上传递
以下画棵线段树模拟一下其实挺好理解的。
void pushup(int rt)
{
int ls=rt<<1,rs=rt<<1|1;t[rt].sum = t[ls].sum+t[rs].sum;//区间之和 = 左区间之和+右区间之和t[rt].max_sum = max(max(t[ls