线段树 9 pts 求助
查看原帖
线段树 9 pts 求助
558336
root357楼主2022/5/25 17:30

如题目,只有测试点 #1 AC, 本人怀疑是在 pushup 或 Query() 的最后部分有错,找了半天没找着,求助各位。

#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdio>

using namespace std;

const int N = 500010;
const int Inf = 1e4 + 10;

struct SegTree {
	int sum;
	int val, lv, rv;
};

int a[N] = {0};

SegTree T[N << 2];

void pushup (int k) {
	int ls = (k << 1);
	int rs = (k << 1) | 1;
	
	T[k].sum = T[ls].sum + T[rs].sum;
	T[k].val = max({T[ls].val, T[rs].val, T[ls].rv + T[rs].lv});
	T[k].lv = max(T[ls].lv, T[ls].sum + T[rs].lv);
	T[k].rv = max(T[rs].rv, T[ls].lv + T[rs].sum);
	
}

void Build (int k, int l, int r) {
	T[k].sum = T[k].val = T[k].lv = T[k].rv = -Inf;
	
	if (l == r) {
		T[k].sum = T[k].val = a[l];
		T[k].lv = T[k].rv = a[l];
		return;
	}
	
	int Mid = (l + r) >> 1;
	
	Build(k << 1, l, Mid);
	Build((k << 1) | 1, Mid + 1, r);
	
	pushup(k);
	
} 

void Update (int k, int l, int r, int x, int v) {
	if (l == r) {
		T[k].sum = T[k].val = v;
		T[k].lv = T[k].rv = v;
		return;
	}
	
	int Mid = (l + r) >> 1;
	
	if (x <= Mid) Update(k << 1, l, Mid, x, v);
	else Update((k << 1) | 1, Mid + 1, r, x, v);
	
	pushup(k);
	
}

SegTree Query (int k, int l, int r, int x, int y) {
	if (x <= l && r <= y) 
		return T[k];
	
	int Mid = (l + r) >> 1;
	
	if (y <= Mid) return Query(k << 1, l, Mid, x, y);
	if (x >  Mid) return Query((k << 1) | 1, Mid + 1, r, x, y);
	
	SegTree res;
	SegTree ls, rs;
	
	ls = Query(k << 1, l, Mid, x, y);
	rs = Query((k << 1) | 1, Mid + 1, r, x, y);
	
	res.lv = max(ls.lv, ls.sum + rs.lv);
	res.rv = max(rs.rv, ls.rv + rs.sum);
	res.val = max({ls.val, rs.val, ls.rv + rs.lv});
	
	return res;
	
}

int main()
{
	int n, m;
	scanf("%d%d", &n, &m);
	
	for (int i = 1; i <= n; i ++) 
		scanf("%d", &a[i]);
	
	Build(1, 1, n);
	
	for (int i = 1; i <= m; i ++) {
		int k, a, b;
		scanf("%d%d%d", &k, &a, &b);
		
		if (k == 1) {
			if (a > b) swap(a, b);
			
			SegTree res = Query(1, 1, n, a, b);
			
			printf("%d\n", res.val);
		}
		else {
			Update(1, 1, n, a, b);
		}
		
	}
	
	
	return 0;
}

2022/5/25 17:30
加载中...