线段树求助
查看原帖
线段树求助
540956
douweiqi楼主2024/3/30 15:39
#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
const long long N=1e6+10;
const long long M=1e3+10;
long long n,m,q;
struct Node{
	long long maxz,minz,maxf,minf,zero;
}pa[N],pb[N];
long long a[N],b[N];
Node merge(Node x,Node y){
	Node ans;
	ans.zero=x.zero||y.zero;
	if(!x.maxz||!y.maxz){
		ans.maxz=x.maxz+y.maxz;
		ans.minz=x.minz+y.minz;
	}else{
		ans.maxz=max(x.maxz,y.maxz);
		ans.minz=min(x.minz,y.minz);
	}
	if(!x.maxf||!y.maxf){
		ans.maxf=x.maxf+y.maxf;
		ans.minf=x.minf+y.minf;
	}else{
		ans.maxf=max(x.maxf,y.maxf);
		ans.minf=min(x.minf,y.minf);
	}
	return ans;
}

Node push(long long k){
	Node ans11;
	ans11.maxf=ans11.maxz=ans11.minf=ans11.minz=ans11.zero=0;
	if(k==0) ans11.zero=1;
	if(k<0) ans11.minf=ans11.maxf=k;
	if(k>0) ans11.maxz=ans11.minz=k;
	return ans11;
}
void builda(long long l,long long r,long long k){
	if(l==r){
		pa[k]=push(a[l]);
		return ;
	}
	long long mid=(l+r)/2;
	builda(l,mid,k*2);
	builda(mid+1,r,k*2+1);
	pa[k]=merge(pa[k*2],pa[k*2+1]);
}
void buildb(long long l,long long r,long long k){
	if(l==r){
		pb[k]=push(b[l]);
		return ;
	}
	long long mid=(l+r)/2;
	buildb(l,mid,k*2);
	buildb(mid+1,r,k*2+1);
	pb[k]=merge(pb[k*2],pb[k*2+1]);
}
Node finda(long long l,long long r,long long s,long long t,long long k){
	if(l<=s&&t<=r){
		return pa[k];
	}
	long long mid=(s+t)/2;
	if(l>mid){
		return finda(l,r,mid+1,t,k*2+1);
	}
	if(r<=mid+1){
		return finda(l,r,s,mid,k*2);
	}
	return merge(finda(l,r,mid+1,t,k*2+1),finda(l,r,s,mid,k*2));
}
Node findb(long long l,long long r,long long s,long long t,long long k){
	if(l<=s&&t<=r){
		return pb[k];
	}
	long long mid=(s+t)/2;
	if(l>mid){
		return findb(l,r,mid+1,t,k*2+1);
	}
	if(r<=mid+1){
		return findb(l,r,s,mid,k*2);
	}
	return merge(findb(l,r,mid+1,t,k*2+1),findb(l,r,s,mid,k*2));
}
void init(){
	cin>>n>>m>>q;
	for(long long i=1;i<=n;i++){
		cin>>a[i];
	}
	for(long long i=1;i<=m;i++){
		cin>>b[i];
	}
	builda(1,n,1);
	buildb(1,m,1);
}
long long Ans(Node x,Node y){
	long long ans;
	if(y.minf!=0&&y.minz==0){
		if(x.minz!=0){
			if(y.zero){
				ans=0;
			}else{
				ans=x.minf*y.maxf;
			}
		}else{
			if(x.zero){
				ans=0;
			}else{
				ans=x.minz*y.minf;
			}
		}
	}
	else if(y.minf==0&&y.minz!=0){
		if(x.minz!=0){
			if(y.zero){
				ans=0;
			}else{
				ans=x.maxz*y.minz;
			}
		}else{
			if(x.zero){
				ans=0;
			}else{
				ans=x.maxf*y.maxz;
			}
		}
	}else{
		if(x.zero) ans=0;
		if(x.minf!=0&&x.minz==0){
			ans=x.maxf*y.maxz;
		}
		if(x.minf==0&&x.minz!=0){
		    ans=x.minz*y.minf;
        }
        ans=max(x.minz*y.minf,x.maxf*y.maxz);
    }
	
	return ans;
}
int main(){
	init();
	while(q--){
		long long l1,r1,r2,l2;
		cin>>l1>>r1>>l2>>r2;
		Node x=finda(l1,r1,1,n,1);
		// 
		//cout<<x.maxf<<' '<<x.maxz<<' '<<x.minf<<' '<<x.minz<<' '<<x.zero<<endl;
		//
		Node y=findb(l2,r2,1,m,1);
		//
		//cout<<y.maxf<<' '<<y.maxz<<' '<<y.minf<<' '<<y.minz<<' '<<y.zero<<endl;
		//
		cout<<Ans(x,y)<<endl;
	}
	return 0;
}
2024/3/30 15:39
加载中...