区间最大子段和 - 线段树

#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;
}

猜你喜欢

转载自blog.csdn.net/fantasy_world/article/details/80027237