求调 ty 玄关 线段树40分
查看原帖
求调 ty 玄关 线段树40分
1040658
Needna楼主2024/10/25 21:09
#include<bits/stdc++.h>
#define inf INT_MAX
using namespace std;
const int N=5e5+10;
int n,m,q,a[N],b[N];
struct ta{
	int afmax=INT_MIN,azmin=INT_MAX,amax,amin;
}aa[N];
struct tb{
	int bmax,bmin;
}bb[N];
int query_bmax(int p,int x,int y,int l,int r){
	int ans=-inf;
	if(l<=x&&y<=r) return bb[p].bmax;
	int mid=x+y>>1;
	if(l<=mid) ans=max(ans,query_bmax(p<<1,x,mid,l,r));
	if(r>mid) ans=max(ans,query_bmax(p<<1|1,mid+1,y,l,r));
	return ans;
}
int query_bmin(int p,int x,int y,int l,int r){
	int ans=inf;
	if(l<=x&&y<=r) return bb[p].bmin;
	int mid=x+y>>1;
	if(l<=mid) ans=min(ans,query_bmin(p<<1,x,mid,l,r));
	if(r>mid) ans=min(ans,query_bmin(p<<1|1,mid+1,y,l,r));
	return ans;
}
int query_amax(int p,int x,int y,int l,int r){
	int ans=-inf;
	if(l<=x&&y<=r) return aa[p].amax;
	int mid=x+y>>1;
	if(l<=mid) ans=max(ans,query_amax(p<<1,x,mid,l,r));
	if(r>mid) ans=max(ans,query_amax(p<<1|1,mid+1,y,l,r));
	return ans;
}
int query_amin(int p,int x,int y,int l,int r){
	int ans=inf;
	if(l<=x&&y<=r) return aa[p].amin;
	int mid=x+y>>1;
	if(l<=mid) ans=min(ans,query_amin(p<<1,x,mid,l,r));
	if(r>mid) ans=min(ans,query_amin(p<<1|1,mid+1,y,l,r));
	return ans;
}
int query_afmax(int p,int x,int y,int l,int r){
	int ans=-inf;
	if(l<=x&&y<=r) return aa[p].afmax;
	int mid=x+y>>1;
	if(l<=mid) ans=max(ans,query_afmax(p<<1,x,mid,l,r));
	if(r>mid) ans=max(ans,query_afmax(p<<1|1,mid+1,y,l,r));
	return ans;
}
int query_azmin(int p,int x,int y,int l,int r){
	int ans=inf;
	if(l<=x&&y<=r) return aa[p].azmin;
	int mid=x+y>>1;
	if(l<=mid) ans=min(ans,query_azmin(p<<1,x,mid,l,r));
	if(r>mid) ans=min(ans,query_azmin(p<<1|1,mid+1,y,l,r));
	return ans;
}
long long calc(int l1,int r1,int l2,int r2){
	long long ans=-inf;
	long long bbmax=query_bmax(1,1,m,l2,r2),bbmin=query_bmin(1,1,m,l2,r2);
	long long aafmax=query_afmax(1,1,n,l1,r1),aazmin=query_azmin(1,1,n,l1,r1);
	long long aamax=query_amax(1,1,n,l1,r1),aamin=query_amin(1,1,n,l1,r1);
	if(aamax>=0){ans=max(ans,aamax*bbmin);}
	else{ans=max(ans,aamax*bbmax);}
	if(aazmin>=0){ans=max(ans,aazmin*bbmin);}
	if(aamin<0){ans=max(ans,aamin*bbmax);}
	else{ans=max(ans,aamin*bbmin);}
	if(aafmax<0){ans=max(ans,aafmax*bbmax);}
	return ans;
}
void builda(int p,int l,int r){
    if(l==r){
	    if(a[l]<0){aa[p].afmax=aa[p].amax=aa[p].amin=a[l];}
	    else{aa[p].azmin=aa[p].amax=aa[p].amin=a[l];}
	    return;
	}
    int mid=l+r>>1;
    builda(p<<1,l,mid);builda(p<<1|1,mid+1,r);
    aa[p].amax=max(aa[p<<1].amax,aa[p<<1|1].amax);
    aa[p].amin=min(aa[p<<1].amin,aa[p<<1|1].amin);
    aa[p].afmax=max(aa[p<<1].afmax,aa[p<<1|1].afmax);
    aa[p].azmin=min(aa[p<<1].azmin,aa[p<<1|1].azmin);
}
void buildb(int p,int l,int r){
	if(l==r){
		bb[p].bmax=bb[p].bmin=b[l];
		return;
	}
	int mid=l+r>>1;
	buildb(p<<1,l,mid);buildb(p<<1|1,mid+1,r);
	bb[p].bmax=max(bb[p<<1].bmax,bb[p<<1|1].bmax);
	bb[p].bmin=min(bb[p<<1].bmin,bb[p<<1|1].bmin);
}
signed main(){
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
    	cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	builda(1,1,n);
	buildb(1,1,m);
	for(int i=1;i<=q;i++){
		int l1,r1,l2,r2;
		cin>>l1>>r1>>l2>>r2;
		cout<<calc(l1,r1,l2,r2)<<'\n';
	}
	return 0;
}

2024/10/25 21:09
加载中...