萌新不会入门题,求助qwq
  • 板块灌水区
  • 楼主Brainless_zxc
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/5/27 18:58
  • 上次更新2024/5/27 21:28:46
查看原帖
萌新不会入门题,求助qwq
661274
Brainless_zxc楼主2024/5/27 18:58

入门题,会 a+b 的都会做,帮我调一下,样例过不去qwq

初步诊断为区间有交集情况写挂了/qd

#include<bits/stdc++.h>
using namespace std;
long long n,q,a[10005],T;
struct Tree{
	long long l,r,ans,sum;
}tree[40005];
inline Tree push_up(Tree l,Tree r){
	Tree zxc;
	zxc.sum=l.sum+r.sum;
	zxc.l=max(l.l,l.sum+r.l);
	zxc.r=max(r.r,r.sum+l.r);
	zxc.ans=max(l.r+r.l,max(l.ans,r.ans));
	return zxc;
}
inline void build(long long l,long long r,long long p){
	if(l==r){
		tree[p].ans=a[l];
		tree[p].l=a[l];
		tree[p].r=a[l];
		tree[p].sum=a[l];
		return;
	}
	long long mid=(l+r)/2;
	build(l,mid,p*2);
	build(mid+1,r,p*2+1);
	push_up(tree[p*2],tree[p*2+1]);
	return;
}
inline Tree query_max(long long nl,long long nr,long long l,long long r,long long p){
	if(l>nr||r<nl){
		return (Tree){0,0,0,0};
	}
	if(l>=nl&&r<=nr){
		return tree[p];
	}
	long long mid=(l+r)/2;
	if(nr<=mid){
		return query_max(nl,nr,l,mid,p*2);
	}
	if(nl>mid){
		return query_max(nl,nr,mid+1,r,p*2+1);
	}
	else{
		return push_up(query_max(nl,nr,l,mid,p*2),query_max(nl,nr,mid+1,r,p*2+1));
	}
}
inline long long query(long long l1,long long r1,long long l2,long long r2,long long l,long long r,long long p){
	if(r1<l2){
		return query_max(l1,r1,l,r,p).r+query_max(r1+1,l2-1,l,r,p).sum+query_max(l2,r2,l,r,p).l;
	}
	long long ans=query_max(l2,r1,l,r,p).ans;
	if(l1<l2){
		ans=max(ans,query_max(l1,r2,l,r,p).r+query_max(l2,r2,l,r,p).l-a[l2]);
	}
	if(r1<r2){
		ans=max(ans,query_max(l1,r1,l,r,p).r+query_max(r1,r2,l,r,p).l-a[r1]);
	}
	return ans;
}
int main(){
	cin>>T;
	while(T--){
		memset(tree,0,sizeof(tree));
		cin>>n;
		long long x1,y1,x2,y2;
		for(int i=1;i<=n;i++){
			cin>>a[i];
		}
		build(1,n,1);
		cin>>q;
		while(q--){
			cin>>x1>>y1>>x2>>y2;
			cout<<query(x1,y1,x2,y2,1,n,1)<<endl;
		}
	}
}
/*
1
6
3 -2 1 -4 5 2
1
1 3 2 5

ans : 
*/ 
2024/5/27 18:58
加载中...