#include <iostream>
#include <algorithm>
#include <cstdio>
using namespace std;
#define debug(x) cerr << #x << "=" << x << endl;
const int MAXN = 1000000 + 10;
int a[MAXN], n;
int maxx(int a, int b, int c) {
int maxx_temp = a;
if(maxx_temp < b) maxx_temp = b;
if(maxx_temp < c) maxx_temp = c;
return maxx_temp;
}
struct SegmentTree {
int l, r, k, lmax, rmax, sum;
}t[MAXN * 4];
void init(int p) {
t[p].sum = t[p*2].sum + t[p*2+1].sum;
t[p].lmax = max(t[p*2].lmax, t[p*2].sum + t[p*2+1].lmax);
t[p].rmax = max(t[p*2+1].rmax, t[p*2+1].sum + t[p*2].rmax);
t[p].k = maxx(t[p*2].k, t[p*2+1].k, t[p*2].rmax + t[p*2+1].lmax);
}
void build(int p, int l, int r) {
t[p].l = l, t[p].r = r;
if(l == r) {
t[p].k = a[l], t[p].lmax = a[l], t[p].rmax = a[l], t[p].sum = a[l];
return;
}
int mid = l+r >> 1;
build(p*2,l, mid);
build(p*2+1, mid+1, r);
init(p);
}
void change(int p, int x, int v) {
if(t[p].l == t[p].r) {
t[p].k = v, t[p].lmax = v, t[p].rmax = v, t[p].sum = v;
return;
}
int mid = t[p].l + t[p].r >> 1;
if(x <= mid)
change(p*2, x, v);
else
change(p*2+1, x, v);
}
SegmentTree que(int p, int l, int r) {
if(l <= t[p].l && r >= t[p].r)
return t[p];
int mid = l+r >> 1;
SegmentTree la, ra, res;
int flgl = 0, flgr = 0;
if(l <= mid) {
la = que(p*2, l, mid);
flgl = 1;
}
if(r > mid) {
ra = que(p*2+1, mid+1, r);
flgr = 1;
}
if(flgl && flgr) {
res.sum = la.sum + ra.sum;
res.lmax = max(la.lmax, la.sum + ra.lmax);
res.rmax = max(ra.rmax, ra.sum + la.rmax);
res.k = maxx(la.k, ra.k, la.rmax + ra.lmax);
}
else if(flgl == 1)
res = la;
else
res = ra;
return res;
}
int main() {
scanf("%d", &n);
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
build(1,1,n);
SegmentTree ans = que(1,1,n);
printf("%d\n", ans.k);
return 0;
}
区间最大子段和 - 线段树
最新推荐文章于 2022-04-08 00:26:39 发布