求条
查看原帖
求条
1024565
Renyaoyao楼主2025/1/4 16:25
#include<bits/stdc++.h>
#define int long long
#define zd (p<<1)
#define yd (p<<1|1)	
using namespace std;
const int INF=-1e9;
int read();
void write(int x);
struct node{
	int num,lmx,rmx,ans,l,r;
}tr[200001];
int dat[50001],n,m,a,b,c,d,t;
void pushup(int p);
void build(int p,int l,int r);
node query(int p,int l,int r,int ql,int qr);
int ansss(int l1,int r1,int l2,int r2);
signed main(){
	t=read();
	while(t--){
		n=read();
		build(1,1,n);
		m=read();
		while(m--){
			a=read(),b=read(),c=read(),d=read();
			write(ansss(a,b,c,d));
			printf("\n");
		}
	}
	return 0;
} 
int read() {
    int x=0,f=1;
    char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9') x=x*10+c-'0',c=getchar();
    return x*f;
}
void write(int x) {
     if(x<0) putchar('-'),x=-x;
     if(x>9) write(x/10);
     putchar(x%10+'0');
}
void pushup(int p){
	tr[p].num=tr[zd].num+tr[yd].num;
	tr[p].lmx=max(tr[zd].lmx,tr[zd].num+tr[yd].lmx);
	tr[p].rmx=max(tr[yd].rmx,tr[yd].num+tr[zd].rmx);
	tr[p].ans=max(tr[zd].ans,max(tr[yd].ans,tr[zd].rmx+tr[yd].lmx));
}
void build(int p,int l,int r){
//	cout<<l<<" "<<r<<"\n\n";
	tr[p].l=l;
	tr[p].r=r;
	if(l==r){
		dat[l]=read(); 
		tr[p].num=tr[p].ans=tr[p].lmx=tr[p].rmx=dat[l];
//		cout<<a[l]<<" "<<l<<"\n";
		return;
	} 
	int mid=(l+r)/2;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	pushup(p);
}
node query(int p,int l,int r,int ql,int qr){
	if(ql>r||qr<l)return {0,0,0,0,0};
	if(ql<=l&&qr>=r) return tr[p];
	int mid=(l+r)>>1;
	node x=query(zd,l,mid,ql,qr);
	node y=query(yd,mid+1,r,ql,qr);
	node z;
	z.num=x.num+y.num;
	z.lmx=max(x.lmx,x.num+y.lmx);
	z.rmx=max(y.rmx,y.num+x.rmx);
	z.ans=max(x.ans,max(y.ans,x.rmx+y.lmx));
	return z;
} 
int ansss(int l1,int r1,int l2,int r2){
    if(r1<l2){
        int tmp=query(1,1,n,l1,r1).rmx;
        tmp+=query(1,1,n,r1+1,l2-1).num;
        tmp+=query(1,1,n,l2,r2).lmx;
        return tmp;
    }
    int ans=query(1,1,n,l2,r1).ans;
    if(l1<l2)ans=max(ans,query(1,1,n,l1,l2).rmx+query(1,1,n,l2,r2).lmx-dat[l2]);
    if(r2>r1)ans=max(ans,query(1,1,n,l1,r1).rmx+query(1,1,n,r1,r2).lmx-dat[r1]);
    ans=max(ans,0ll);
    return ans;
}
2025/1/4 16:25
加载中...