调不动了/dk
查看原帖
调不动了/dk
352464
JJA_楼主2021/3/22 23:27

代码:

#include<bits/stdc++.h>
#define mid(l,r) (l+r)>>1
#define lc(a) a<<1
#define rc(a) a<<1|1
#define MAXN 50005
//#define max(a,b) a>b?a:b
#define forr(i,a,b) for(int i=a;i<=b;++i)
using namespace std;
int a[MAXN*2];
typedef struct Segment_Tree{
	int les,res;
	int ans,val;
}Tree;
Tree tree[MAXN*4];
void update(int i){
	Tree l=tree[lc(i)],r=tree[rc(i)];
	tree[i].val=l.val+r.val;
	tree[i].les=max(l.les,l.val+r.les);
	tree[i].res=max(r.res,r.val+l.res);
	tree[i].ans=max(l.res+r.les,max(l.ans,r.ans));
}
void build(int i,int l,int r){
	if(l==r){
		tree[i].ans=tree[i].les=tree[i].res=tree[i].val=a[l];
		return;
	}
	int mid=mid(l,r);
	build(lc(i),l,mid);
	build(rc(i),mid+1,r);
	update(i);
}
void Change(int p,int i,int l,int r,int val){
	if(l==r){
		tree[i].ans=tree[i].les=tree[i].res=tree[i].val=val;
		return;
	}
	int mid=mid(l,r);
	if(p<=mid){
		Change(p,lc(i),l,mid,val);
	}
	else Change(p,rc(i),mid+1,r,val);
	update(i);
}
Tree query(int i,int l,int r,int x,int y){
	if(x<=l&&y>=r){
		return tree[i];
	}
	int mid=mid(l,r);
	if(y<=mid){
		return query(lc(i),l,mid,x,y); 
	}
	if(x>mid){
		return query(rc(i),mid+1,r,x,y);
	}
	Tree L=query(lc(i),l,mid,x,y);
	Tree R=query(rc(i),mid+1,r,x,y);
	Tree Ans;
	Ans.val=L.val+R.val;
	Ans.les=max(L.les,L.val+R.les);
	Ans.res=max(R.res,R.val+L.res);
	Ans.ans=max(L.res+R.les,max(L.ans,R.ans));
	return Ans;
}
int n,m;
int main(){
	scanf("%d",&n);
	forr(i,1,n){
		scanf("%d",&a[i]);
	}
	build(1,1,n);
	scanf("%d",&m);
	forr(i,1,m){
		int op,x,y;
		scanf("%d%d%d",&op,&x,&y);
		if(op==0){
			Change(x,1,1,n,y);
		}
		else{
			printf("%d\n",query(1,1,n,x,y).ans);
		}
	}
}

一直WA

感觉像是 update 出了问题

2021/3/22 23:27
加载中...