27 分 TLE 求助
查看原帖
27 分 TLE 求助
363036
chlchl楼主2022/11/6 16:24

有交换 a,ba,b,空间应该也开够了,求调。

#include<bits/stdc++.h>
using namespace std;

const int N = 5e5 + 10;
const int M = N << 2;
int n, m, a[N];
int ans[M], lm[M], rm[M], sum[M];
struct node{
	int res, lres, rres, sum;
};

#define ls(o) (o << 1)
#define rs(o) (o << 1 | 1)

void pushup(int o){
	sum[o] = sum[ls(o)] + sum[rs(o)];
	lm[o] = max(lm[ls(o)], sum[ls(o)] + lm[rs(o)]);
	rm[o] = max(rm[rs(o)], sum[rs(o)] + rm[ls(o)]);
	ans[o] = max(max(ans[ls(o)], ans[rs(o)]), rm[ls(o)] + lm[rs(o)]);
}

void build(int o, int l, int r){
	if(l == r){
		ans[o] = lm[o] = rm[o] = sum[o] = a[l];
		return ;
	}
	int mid = (l + r) >> 1;
	build(ls(o), l, mid);
	build(rs(o), mid + 1, r);
	pushup(o);
}

void update(int o, int l, int r, int p, int v){
	if(l == r){
		ans[o] = lm[o] = rm[o] = sum[o] = v;
		return ;
	}
	int mid = (l + r) >> 1;
	if(p <= mid)
		update(ls(o), l, mid, p, v);
	else
		update(rs(o), mid + 1, r, p, v);
	pushup(o);
}

node query(int o, int l, int r, int s, int t){
	if(l == r)
		return (node){ans[o], lm[o], rm[o], sum[o]};
	int mid = (l + r) >> 1;
	node now = (node){0, 0, 0, 0};
	if(t <= mid)
		return query(ls(o), l, mid, s, t);
	if(s > mid)
		return query(rs(o), mid + 1, r, s, t);
	node p = query(ls(o), l, mid, s, t);
	node q = query(rs(o), mid + 1, r, s, t);
	now.sum = p.sum + q.sum;
	now.lres = max(p.lres, p.sum + q.lres);
    now.rres = max(q.rres, q.sum + p.rres);
	now.res = max(max(p.res, q.res), p.rres + q.lres);
	return now;
}

int main(){
	scanf("%d%d", &n, &m);
	for(int i=1;i<=n;i++)
		scanf("%d", &a[i]);
	build(1, 1, n);
	while(m--){
		int op, a, b;
		scanf("%d%d%d", &op, &a, &b);
		if(op == 1)
			printf("%d\n", query(1, 1, n, min(a, b), max(a, b)).res);
		else
			update(1, 1, n, a, b);
	}
	return 0;
}
2022/11/6 16:24
加载中...