求助
查看原帖
求助
683212
Henly_Z楼主2023/9/24 12:15
#include <bits/stdc++.h>

using namespace std;

typedef long long ll;

const int N = 1000000 + 10;

struct Node {
	ll sum, max , lmax , rmax;
};

Node sgt[N*4];
int a[N];
Node merge(Node n1 , Node n2){
	Node nd;
	nd.sum = n1.sum + n2.sum;
	nd.max = max({n1.max , n2.max , n1.rmax + n2.lmax});
	nd.lmax = max(n1.lmax , n1.sum + n2.lmax);
	nd.rmax = max(n2.rmax , n2.sum + n1.rmax);
	return nd;
}
void push_up(int index) {
	sgt[index] = merge(sgt[index * 2] , sgt[index * 2 + 1]);
}

void build(int index, int begin, int end) {
	if (begin == end) {
		sgt[index].lmax = a[index];
		sgt[index].rmax = a[index];
		sgt[index].max = a[index];
		sgt[index].sum = a[index];
		return;
	}
	int mid = (begin + end) / 2;
	build(index * 2, begin, mid);
	build(index * 2 + 1, mid + 1, end);
	push_up(index);
}

void update(int index , int begin,int end,int p,int s) {
	if (begin == end) {
		sgt[index].lmax = sgt[index].rmax = sgt[index].max = sgt[index].sum = s;
		return;
	}	
	int mid = (begin + end) / 2;
	if (p <= mid) update(index * 2 , begin , mid , p , s);
	else  update(index * 2 + 1,mid + 1,end, p , s);
	push_up(index);
}

Node getsum(int index,  int begin , int end , int left, int right) {
	if(left <= begin && right >= end){
		return sgt[index];
	}
	int mid = (begin + end ) / 2;
	if(right <= mid) return getsum(index * 2 ,begin,mid, left , right);
	else if(left > mid) return getsum(index * 2 + 1 ,mid + 1 , end , left , right);
	else return merge(getsum(index * 2 , begin , mid,left , mid),getsum(index * 2 + 1 ,mid + 1 , end ,  mid+1 , right));
}

int main() {
	int n, q, op, l, r, x;
	scanf("%d %d", &n, &q);
	for (int i=1; i<=n; i++) scanf("%d", &a[i]);
	build(1, 1, n);
	while (q --) {
		scanf("%d", &op);
		if (op == 2) {
			scanf("%d %d", &l, &r);
			update(1,1,n,l,r);
		}
		else {
			scanf("%d %d", &l, &r);
			if(l > r) swap(l , r);
			printf("%lld\n", getsum(1,1,n,l,r).max);
		}
	}
	return 0;
}

在昨天的基础上有了修改 但是不对

2023/9/24 12:15
加载中...