40pts,求调!!!
查看原帖
40pts,求调!!!
730192
gaomingyang101011楼主2024/10/11 17:54
#include<iostream>
using namespace std;
const int N=1e6+5;
const long long MAX_=1e9+3;
const long long MIN_=-1e9+3;
const long long MIN=-1e16;
long long n,m,q;
long long a[N],b[N],maxa[N],mina[N];
long long la,lb,ra,rb;
long long ans;
long long treeminx[N<<2];
void buildminx(long long l,long long r,int i){
	if(l==r){
		treeminx[i]=a[l];
		return;
	}
	long long mid=(l+r)/2;
	buildminx(l,mid,i*2);
	buildminx(mid+1,r,i*2+1);
	treeminx[i]=min(treeminx[i*2],treeminx[i*2+1]);
}
long long cminx(long long sl,long long sr,long long l,long long r,int i){
	if(l==r||(sl==l&&sr==r)) return treeminx[i];
	long long mid=(l+r)/2;
	if(sl<=mid&&sr>mid) return min(cminx(sl,mid,l,mid,i*2),cminx(mid+1,sr,mid+1,r,i*2+1));
	else if(sr<=mid) return cminx(sl,sr,l,mid,i*2);
	else return cminx(sl,sr,mid+1,r,i*2+1);
}
long long treemaxx[N<<2];
void buildmaxx(long long l,long long r,int i){
	if(l==r){
		treemaxx[i]=a[l];
		return ;
	}
	long long mid=(l+r)/2;
	buildmaxx(l,mid,i*2);
	buildmaxx(mid+1,r,i*2+1);
	treemaxx[i]=max(treemaxx[i*2],treemaxx[i*2+1]);
}
long long cmaxx(long long sl,long long sr,long long l,long long r,int i){
	if(l==r||(sl==l&&sr==r)) return treemaxx[i];
	long long mid=(l+r)/2;
	if(sl<=mid&&sr>mid) return max(cmaxx(sl,mid,l,mid,i*2),cmaxx(mid+1,sr,mid+1,r,i*2+1));
	else if(sr<=mid) return cmaxx(sl,sr,l,mid,i*2);
	else return cmaxx(sl,sr,mid+1,r,i*2+1);
}
long long treeminfx[N<<2];
void buildminfx(long long l,long long r,int i){
	if(l==r){
		treeminfx[i]=mina[l];
		return;
	}
	long long mid=(l+r)/2;
	buildminfx(l,mid,i*2);
	buildminfx(mid+1,r,i*2+1);
	treeminfx[i]=min(treeminfx[i*2],treeminfx[i*2+1]);
}
long long cminfx(long long sl,long long sr,long long l,long long r,int i){
	if(l==r||(sl==l&&sr==r)) return treeminfx[i];
	long long mid=(l+r)/2;
	if(sl<=mid&&sr>mid) return min(cminfx(sl,mid,l,mid,i*2),cminfx(mid+1,sr,mid+1,r,i*2+1));
	else if(sr<=mid) return cminfx(sl,sr,l,mid,i*2);
	else return cminfx(sl,sr,mid+1,r,i*2+1);
}
long long treemaxfx[N<<2];
void buildmaxfx(long long l,long long r,int i){
	if(l==r){
		treemaxfx[i]=maxa[l];
		return ;
	}
	long long mid=(l+r)/2;
	buildmaxfx(l,mid,i*2);
	buildmaxfx(mid+1,r,i*2+1);
	treemaxfx[i]=max(treemaxfx[i*2],treemaxfx[i*2+1]);
}
long long cmaxfx(long long sl,long long sr,long long l,long long r,int i){
	if(l==r||(sl==l&&sr==r)) return treemaxfx[i];
	long long mid=(l+r)/2;
	if(sl<=mid&&sr>mid) return max(cmaxfx(sl,mid,l,mid,i*2),cmaxfx(mid+1,sr,mid+1,r,i*2+1));
	else if(sr<=mid) return cmaxfx(sl,sr,l,mid,i*2);
	else return cmaxfx(sl,sr,mid+1,r,i*2+1);
}
long long treemaxy[N<<2];
void buildmaxy(long long l,long long r,int i){
	if(l==r){
		treemaxy[i]=b[l];
		return ;
	}
	long long mid=(l+r)/2;
	buildmaxy(l,mid,i*2);
	buildmaxy(mid+1,r,i*2+1);
	treemaxy[i]=max(treemaxy[i*2],treemaxy[i*2+1]);
}
long long cmaxy(long long sl,long long sr,long long l,long long r,int i){
	if(l==r||(sl==l&&sr==r)) return treemaxy[i];
	long long mid=(l+r)/2;
	if(sl<=mid&&sr>mid) return max(cmaxy(sl,mid,l,mid,i*2),cmaxy(mid+1,sr,mid+1,r,i*2+1));
	else if(sr<=mid) return cmaxy(sl,sr,l,mid,i*2);
	else return cmaxy(sl,sr,mid+1,r,i*2+1);
}
long long treeminy[N<<2];
void buildminy(long long l,long long r,int i){
	if(l==r){
		treeminy[i]=b[l];
		return;
	}
	long long mid=(l+r)/2;
	buildminy(l,mid,i*2);
	buildminy(mid+1,r,i*2+1);
	treeminy[i]=min(treeminy[i*2],treeminy[i*2+1]);
}
long long cminy(long long sl,long long sr,long long l,long long r,int i){
	if(l==r||(sl==l&&sr==r)) return treeminy[i];
	long long mid=(l+r)/2;
	if(sl<=mid&&sr>mid) return min(cminy(sl,mid,l,mid,i*2),cminy(mid+1,sr,mid+1,r,i*2+1));
	else if(sr<=mid) return cminy(sl,sr,l,mid,i*2);
	else return cminy(sl,sr,mid+1,r,i*2+1);
}
int main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		maxa[i]=a[i];
		if(maxa[i]>=0) maxa[i]=MIN_;
		mina[i]=a[i];
		if(mina[i]<0) mina[i]=MAX_;
	}	
	for(int i=1;i<=m;i++) cin>>b[i];
	buildminx(1,n,1);
	buildmaxx(1,n,1);
	buildminfx(1,n,1);
	buildmaxfx(1,n,1);
	buildminy(1,n,1);
	buildmaxy(1,n,1);
	long long maxx,minx,maxfx,minfx,maxy,miny;
	while(q--){
		ans=MIN;
		cin>>la>>lb>>ra>>rb;
		minx=cminx(la,lb,1,n,1);
		maxx=cmaxx(la,lb,1,n,1);
		maxfx=cmaxfx(la,lb,1,n,1);
		minfx=cminfx(la,lb,1,n,1);
		maxy=cmaxy(ra,rb,1,n,1);
		miny=cminy(ra,rb,1,n,1);
		//cout<<minx<<" "<<maxx<<" "<<maxfx<<" "<<minfx<<" "<<maxy<<" "<<miny<<endl;
		if(minx<0) ans=max(ans,minx*maxy);
		else ans=max(ans,minx*miny);
		if(minfx<0) ans=max(ans,minfx*maxy);
		else ans=max(ans,minfx*miny);
		if(maxx<0) ans=max(ans,maxx*maxy);
		else ans=max(ans,maxx*miny);
		if(maxfx<0) ans=max(ans,maxfx*maxy);
		else ans=max(ans,maxfx*miny);
		cout<<ans<<endl;
	}
	return 0;
}
2024/10/11 17:54
加载中...