小白逛公园
解题思路
我们用线段树维护 m a x v , m a x l , m a x r , s maxv,maxl,maxr,s maxv,maxl,maxr,s 四个值,分别代表区间最大值,包含左端点在内的最大值,包括右端点内的最大值和区间总值。
显然,对于一个节点,它的转移方程如下:
now.s=l.s+r.s;
now.maxl=max(l.maxl,l.s+r.maxl);
now.maxr=max(r.maxr,r.s+l.maxr);
now.maxv=max(l.maxv,max(l.maxr+r.maxl,r.maxv));
code
#include<iostream>
#include<cstdio>
using namespace std;
int n,m;
struct abc{
int s;
int maxl,maxr,maxv;
}tree[2000010];
abc