线段树 9pts 求助
查看原帖
线段树 9pts 求助
556457
Annie07楼主2023/8/11 17:34

考虑交换了

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 5e5 + 5;
ll n, m;

ll read() {
	ll x = 0, f = 1;
	char ch = getchar();
	while(ch < '0' || ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while(ch >= '0' && ch <= '9') {
		x = (x << 3) + (x << 1) + ch - '0';
		ch = getchar();
	}
	return x * f;
}

struct node {
	ll sum, val, lv, rv;
	node() { }
	node(ll _sum, ll _val, ll _lv, ll _rv) {
		sum = _sum, val = _val, lv = _lv, rv = _rv;
	}
}f[N * 4];

void pushup(ll k, ll l, ll r) {
	f[k].sum = f[k * 2].sum + f[k * 2 + 1].sum;
	f[k].lv = max(f[k * 2].lv, f[k * 2].sum + f[k * 2 + 1].lv);
	f[k].rv = max(f[k * 2 + 1].sum + f[k * 2].rv, f[k * 2 + 1].rv);
	f[k].val = max(max(f[k * 2].sum, f[k * 2 + 1].sum)
	, f[k * 2 + 1].lv + f[k * 2].rv);
}
ll a;
void build(ll k, ll l, ll r) {
	if (l == r) {
		a = read();
		f[k].lv = f[k].rv = f[k].sum = f[k].val = a;
		return;
	}
	ll mid = (l + r) >> 1;
	build(k * 2, l, mid);
	build(k * 2 + 1, mid + 1, r);
	pushup(k, l, r);
}

void update(ll k, ll l, ll r, ll x, ll s) {
	if (l == r && l == x) {
		f[k].lv = f[k].rv = f[k].sum = f[k].val = s;
		return;
	}
	ll mid = (l + r) >> 1;
	if (x <= mid)	update(k * 2, l, mid, x, s);
	else update(k * 2 + 1, mid + 1, r, x, s);
	pushup(k, l, r);
}
node ask(ll k, ll l, ll r, ll x, ll y) {
	if (x <= l && r <= y) return f[k];
	ll mid = (l + r) >> 1;
	node u, v;
	
	if (x <= mid) u = ask(k * 2, l, mid, x, y);
	if (y > mid) v = ask(k * 2 + 1, mid + 1, r, x, y);
	if (x <= mid) {
		return u;
	} else if (y > mid) {
		return v;
	} else {
		ll sum = u.sum + v.sum;
		ll lv = max(u.lv, u.sum + v.lv);
		ll rv = max(v.sum + u.rv, v.rv);
		ll val = max(max(u.sum, v.sum)
		, v.lv + u.rv);
		return node(sum, val, lv, rv);	
	}	
}

int main() {
	//freopen("P4513_2.in", "r", stdin);
	//freopen("P4513.out", "w", stdout);
	n = read(), m = read();
	build(1, 1, n);
	ll k, x, y, p, s;
	while(m--) {
		k = read();
		if (k == 1) {
			x = read(), y = read();
			if (x > y) swap(x, y);
			printf("%lld\n", ask(1, 1, n, x, y).val);	
		} else if (k == 2) {
			p = read(), s = read();
			update(1, 1, n, p, s);
		}
	}
	return 0;
}

谢谢!

2023/8/11 17:34
加载中...