40求条(=_=)
查看原帖
40求条(=_=)
689584
zhangjinfeng楼主2024/10/15 19:54
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,q,a[100005],b[100005];
int Max[100005][20],Min[100005][20];
int MaxF[100005][20],MinZ[100005][20];
int Maxb[100005][20],Minb[100005][20];
int L[100005];
int Mx(int l,int r){
	int x=L[r-l+1];
	int ans=max(Max[l][x],Max[r-(1<<x)+1][x]);
	return ans;
}
int Mn(int l,int r){
	int x=L[r-l+1];
	int ans=min(Min[l][x],Min[r-(1<<x)+1][x]);
	return ans;
}
int Mxb(int l,int r){
	int x=L[r-l+1];
	int ans=max(Maxb[l][x],Maxb[r-(1<<x)+1][x]);
	return ans;
}
int Mnb(int l,int r){
	int x=L[r-l+1];
	int ans=min(Minb[l][x],Minb[r-(1<<x)+1][x]);
	return ans;
}
int MxF(int l,int r){
	int x=L[r-l+1];
	int ans=max(MaxF[l][x],MaxF[r-(1<<x)+1][x]);
	return ans;
}
int MnZ(int l,int r){
	int x=L[r-l+1];
	int ans=min(MinZ[l][x],MinZ[r-(1<<x)+1][x]);
	return ans;
}
signed main(){
	freopen("game4.in","r",stdin);
	freopen("a.out","w",stdout);
	cin>>n>>m>>q;
	for(int i=2;i<=100000;i++)
		L[i]=L[i/2]+1;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a[i]);
		Max[i][0]=Min[i][0]=a[i];
		if(a[i]<=0)MaxF[i][0]=a[i];
		else MaxF[i][0]=-1e18;
		if(a[i]>=0)MinZ[i][0]=a[i];
		else MinZ[i][0]=1e18;
	}
	for(int i=1;i<=m;i++)	
		scanf("%lld",&b[i]),
		Maxb[i][0]=Minb[i][0]=b[i];
	for(int i=1;i<=19;i++)
		for(int j=1;j<=n-(1<<i)+1;j++)
			Max[j][i]=max(Max[j][i-1],Max[j+(1<<(i-1))][i-1]);
	for(int i=1;i<=19;i++)
		for(int j=1;j<=n-(1<<i)+1;j++)
			Min[j][i]=min(Min[j][i-1],Min[j+(1<<(i-1))][i-1]);
	for(int i=1;i<=19;i++)
		for(int j=1;j<=n-(1<<i)+1;j++)
			MaxF[j][i]=max(MaxF[j][i-1],MaxF[j+(1<<(i-1))][i-1]);
	for(int i=1;i<=19;i++)
		for(int j=1;j<=n-(1<<i)+1;j++)
			MinZ[j][i]=min(MinZ[j][i-1],MinZ[j+(1<<(i-1))][i-1]);
	for(int i=1;i<=19;i++)
		for(int j=1;j<=m-(1<<i)+1;j++)
			Maxb[j][i]=max(Maxb[j][i-1],Maxb[j+(1<<(i-1))][i-1]);
	for(int i=1;i<=19;i++)
		for(int j=1;j<=m-(1<<i)+1;j++)
			Minb[j][i]=min(Minb[j][i-1],Minb[j+(1<<(i-1))][i-1]);
	while(q--){
		int l1,r1,l2,r2,ans=-1e18;
		scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
		if(Mnb(l2,r2)>=0){
			ans=Mx(l1,r1)*Mnb(l2,r2);
		}else if(Mxb(l2,r2)<=0){
			ans=Mn(l1,r1)*Mxb(l2,r2);
		}else{
			ans=-1e18;
			if(MnZ(l1,r1)!=1e18)ans=max(ans,MnZ(l1,r1)*Mnb(l2,r2));
			if(MxF(l1,r1)!=-1e18)ans=max(ans,MxF(l1,r1)*Mxb(l2,r2));
		}
		printf("%lld\n",ans);
	}
	
	return 0;
}
/*
1.后手无负数
先手选最大的数
后手选最小的数
2.后手无正数
先手选最小的数
后手选最最大的数
3.后手有正有负
3.1 先手选最小的正数
	后手选最小
3.2 先手选最大的负数
	后手选最大
*/
2024/10/15 19:54
加载中...