萌新求调线段树
查看原帖
萌新求调线段树
575453
ssytxy2024楼主2022/10/2 12:16
#include<bits/stdc++.h>
using namespace std;
struct node{
	int lmax,rmax;
	int l,r;
	int max;
	int sum;
};
node T[200005];
int n,m;
int a[100005];
void push_up(int p){
	T[p].sum=T[p*2].sum+T[p*2+1].sum;
	T[p].lmax=max(T[p*2].lmax,T[p*2].sum+T[p*2+1].lmax);
	T[p].rmax=max(T[p*2+1].rmax,T[p*2+1].sum+T[p*2].rmax);
	T[p].max=max(T[p*2].max,max(T[p*2+1].max,T[p*2].rmax+T[p*2+1].lmax));
}
void build(int l,int r,int p){
	T[p].l=l,T[p].r=r;
	if(l==r){
		T[p].sum=T[p].lmax=T[p].rmax=T[p].max=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	push_up(p);
}
node query(int a,int b,int l,int r,int p){
	if(a<=T[p].l&&b>=T[p].r){
		return T[p];
	}
	int mid=(T[p].l+T[p].r)/2;
	if(a<=mid){
		return query(a,b,l,mid,p*2);
	}
	if(b>mid){
		return query(a,b,mid+1,r,p*2+1);
	}
	else{
		node left,right;
		left=query(a,b,l,mid,p*2),right=query(a,b,mid+1,r,p*2+1);
		node ans;
		ans.sum=left.sum+right.sum;
		ans.max=max(max(left.max,left.rmax+right.lmax),right.max);
		ans.lmax=max(left.lmax,left.sum+right.lmax);
		ans.rmax=max(right.rmax,right.sum+left.rmax);
		return ans;
	}
}
int main(){
	scanf("%d",&n);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	build(1,n,1);
	scanf("%d",&m);
	for(int i=1;i<=m;i++){
		int a,b;
		scanf("%d%d",&a,&b);
		printf("%d\n",query(a,b,1,n,1).max);
	}
	return 0;
}


//SP1043 GSS1 - Can you answer these queries I

SPOJ上面好像是RE,但洛谷显示的是WA(用的自己的账户)

2022/10/2 12:16
加载中...