社区讨论

80pts,求调!!!

学术版参与者 1已保存回复 0

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
0 条
当前快照
1 份
快照标识符
@lo7n7wld
此快照首次捕获于
2023/10/27 04:34
2 年前
此快照最后确认于
2023/10/27 04:34
2 年前
查看原帖
CPP
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1000005;
ll a[N],b[N];
ll zmaxx1[N],zminn1[N],fmaxx1[N],fminn1[N];
ll zmaxx2[N],zminn2[N],fmaxx2[N],fminn2[N];
ll ling1[N],ling2[N];
ll zma1,zmi1,fma1,fmi1,zma2,zmi2,fma2,fmi2,L1,L2;
ll Max(ll x,ll y) {
	if (x>y)
		return x;
	return y;
}
ll Min(ll x,ll y) {
	if (x<y)
		return x;
	return y;
}
void build1(int k,int l,int r) {
	if (l==r) {
		if (a[l]==0) {
			ling1[k]=1;
			zmaxx1[k]=-1;
			zminn1[k]=1e12;
			fmaxx1[k]=-1e12;
			fminn1[k]=1;
			return;
		}
		if (a[l]>0) {
			zmaxx1[k]=zminn1[k]=a[l];
			fmaxx1[k]=-1e12;
			fminn1[k]=1;
		} 
		if (a[l]<0) {
			zmaxx1[k]=-1;
			zminn1[k]=1e12;
			fmaxx1[k]=fminn1[k]=a[l];
		}
		return;
	}
	int mid=l+r>>1;
	build1(k<<1,l,mid);
	build1(k<<1|1,mid+1,r);
	zmaxx1[k]=Max(zmaxx1[k<<1],zmaxx1[k<<1|1]);
	zminn1[k]=Min(zminn1[k<<1],zminn1[k<<1|1]);
	fmaxx1[k]=Max(fmaxx1[k<<1],fmaxx1[k<<1|1]);
	fminn1[k]=Min(fminn1[k<<1],fminn1[k<<1|1]);
	ling1[k]=Max(ling1[k<<1],ling1[k<<1|1]);
}
void build2(int k,int l,int r) {
	if (l==r) {
		if (b[l]==0) {
			ling2[k]=1;
			zmaxx2[k]=-1;
			zminn2[k]=1e12;
			fmaxx2[k]=-1e12;
			fminn2[k]=1;
			return;
		}
		if (b[l]>0) {
			zmaxx2[k]=zminn2[k]=b[l];
			fmaxx2[k]=-1e12;
			fminn2[k]=1;
		} 
		if (b[l]<0) {
			zmaxx2[k]=-1;
			zminn2[k]=1e12;
			fmaxx2[k]=fminn2[k]=b[l];
		}
		return;
	}
	int mid=l+r>>1;
	build2(k<<1,l,mid);
	build2(k<<1|1,mid+1,r);
	zmaxx2[k]=Max(zmaxx2[k<<1],zmaxx2[k<<1|1]);
	zminn2[k]=Min(zminn2[k<<1],zminn2[k<<1|1]);
	fmaxx2[k]=Max(fmaxx2[k<<1],fmaxx2[k<<1|1]);
	fminn2[k]=Min(fminn2[k<<1],fminn2[k<<1|1]);
	ling2[k]=Max(ling2[k<<1],ling2[k<<1|1]);
}
void query_1(int k,int l,int r,int x,int y) {
	if (l>=x && r<=y) {
		zma1=Max(zma1,zmaxx1[k]);
		fma1=Max(fma1,fmaxx1[k]);
		zmi1=Min(zmi1,zminn1[k]);
		fmi1=Min(fmi1,fminn1[k]);
		return;
	}
	int mid=l+r>>1;
	if (mid>=x)
		query_1(k<<1,l,mid,x,y);
	if (mid<y)
		query_1(k<<1|1,mid+1,r,x,y);
}
void query_2(int k,int l,int r,int x,int y) {
	if (l>=x && r<=y) {
		zma2=Max(zma2,zmaxx2[k]);
		fma2=Max(fma2,fmaxx2[k]);
		zmi2=Min(zmi2,zminn2[k]);
		fmi2=Min(fmi2,fminn2[k]);
		return;
	}
	int mid=l+r>>1;
	if (mid>=x)
		query_2(k<<1,l,mid,x,y);
	if (mid<y)
		query_2(k<<1|1,mid+1,r,x,y);
}
void query_L1(int k,int l,int r,int x,int y) {
	if (l>=x && r<=y) {
		L1=Max(L1,ling1[k]);
		return;
	}
	int mid=l+r>>1;
	if (mid>=x)
		query_L1(k<<1,l,mid,x,y);
	if (mid<y)
		query_L1(k<<1|1,mid+1,r,x,y);
}
void query_L2(int k,int l,int r,int x,int y) {
	if (l>=x && r<=y) {
		L2=Max(L2,ling2[k]);
		return;
	}
	int mid=l+r>>1;
	if (mid>=x)
		query_L2(k<<1,l,mid,x,y);
	if (mid<y)
		query_L2(k<<1|1,mid+1,r,x,y);
}
int main() {
	int n,m,q,l1,r1,l2,r2;
	cin>>n>>m>>q;
	for (int i = 1; i <= n; i++)
		scanf("%lld",&a[i]);
	for (int i = 1; i <= m; i++)
		scanf("%lld",&b[i]);
	if (n<=200)
	{
	 	 while (q--)
	 	 {
	 	 	ll ans=-1e18;
     		 scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
			 for (int i = l1; i <= r1; i++)
			 {
			 	 ll now=1e18;
			 	 for (int j = l2; j <= r2; j++)
			 		now=Min(now,a[i]*b[j]);
			 	 ans=Max(ans,now);
			 }
			 printf("%lld\n",ans);
		  }
		  return 0;
	}
	for (int i = 1;  i <= 1000000; i++)
	{
		zmaxx1[i]=zmaxx2[i]=-1;
		zminn1[i]=zminn2[i]=1e12;
		fmaxx1[i]=fmaxx2[i]=-1e12;
		fminn1[i]=fminn2[i]=1;
	}
	build1(1,1,n);
	build2(1,1,m);
	while (q--) {
		L1=0,L2=0;
		zma1=zma2=-1;
		fma1=fma2=-1e12;
		zmi1=zmi2=1e12;
		fmi1=fmi2=1;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		query_1(1,1,n,l1,r1);
		query_2(1,1,m,l2,r2);
		query_L1(1,1,n,l1,r1);
		query_L2(1,1,m,l2,r2);
		ll ans=-1e18,now;
		if (L1==1)
			ans=0;
		if (zma1!=-1) {
			now=1e18;
			if (L2==1)
				now=0;
			if (zma2!=-1) {
				now=Min(now,zma1*zma2);
			}
			if (zmi2!=1e12) {
				now=Min(now,zma1*zmi2);
			}
			if (fma2!=-1e12) {
				now=Min(now,zma1*fma2);
			}
			if (fmi2!=1) {
				now=Min(now,zma1*fmi2);
			}
		}
		ans=Max(ans,now);
		if (zmi1!=1e12) {
			now=1e18;
			if (L2==1)
				now=0;
			if (zma2!=-1) {
				now=Min(now,zmi1*zma2);
			}
			if (zmi2!=1e12) {
				now=Min(now,zmi1*zmi2);
			}
			if (fma2!=-1e12) {
				now=Min(now,zmi1*fma2);
			}
			if (fmi2!=1) {
				now=Min(now,zmi1*fmi2);
			}
		}
		ans=Max(ans,now);
		if (fma1!=-1e12) {
			now=1e18;
			if (L2==1)
				now=0;
			if (zma2!=-1) {
				now=Min(now,fma1*zma2);
			}
			if (zmi2!=1e12) {
				now=Min(now,fma1*zmi2);
			}
			if (fma2!=-1e12) {
				now=Min(now,fma1*fma2);
			}
			if (fmi2!=1) {
				now=Min(now,fma1*fmi2);
			}
		}
		ans=Max(ans,now);
		if (fmi1!=1) {
			now=1e18;
			if (L2==1)
				now=0;
			if (zma2!=-1) {
				now=Min(now,fmi1*zma2);
			}
			if (zmi2!=1e12) {
				now=Min(now,fmi1*zmi2);
			}
			if (fma2!=-1e12) {
				now=Min(now,fmi1*fma2);
			}
			if (fmi2!=1) {
				now=Min(now,fmi1*fmi2);
			}
		}
		ans=Max(ans,now);
		printf("%lld\n",ans);
	}
	return 0;
}

回复

0 条回复,欢迎继续交流。

正在加载回复...