40分求调
查看原帖
40分求调
998687
chenke7楼主2024/6/20 21:10
#include<bits/stdc++.h>
using namespace std;
#define int long long 
//1.如果1只有负数,2只有负数,那么1选最小,2选最大
//2.如果1只有正数,2只有正数,那么1选最大,2选最小
//3.如果1有正有负,2只有负数,那么1选最小,2选最大
//4.如果1有正有负,2只有正数,那么1选最大,2选最小 
//5.如果1只有负数,2有正有负,那么1选最大,2选最大
//6.如果1只有正数,2有正有负,那么1选最小,2选最小 
//7.如果1有正有负,2有正有负,那么max((1正数的最小,2最小),(1负数的最大,2最大))
//1和3可以合并: 2只有负数,那么1选最小,2选最大
//2和4可以合并:2只有正数,那么1选最大,2选最小 
int n,m,q;
int zamin[500050][21];
int famax[500050][21];
int amax[500050][21];
int amin[500050][21];
int bmax[500050][21];
int bmin[500050][21];
int l1,r1,l2,r2;
int maxa,maxb,mina,minb,minza,maxfa;
int len1,len2;
signed main()
{

	//freopen("game3.in","r",stdin);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>amax[i][0];
		amin[i][0]=amax[i][0];
		//如果是正数 ,这里把0也判断为正数 
		if (amax[i][0]>=0)
		{
			zamin[i][0]=amax[i][0];
			famax[i][0]=LONG_LONG_MIN;//因为此时是正数,所以没有负数 
		}
		else
		{
			zamin[i][0]=LONG_LONG_MAX;//因为没有正数
			famax[i][0]=amax[i][0];
		}
	}
	for(int i=1;i<=m;i++)
	{
		cin>>bmax[i][0];
		bmin[i][0]=bmax[i][0];
	} 
	for(int j=1;j<=20;j++){
		for(int i=1;i<=n;i++){
			if (i+(1<<(j-1))<=n)
			{
				amax[i][j]=max(amax[i][j-1],amax[i+(1<<(j-1))][j-1]);
				famax[i][j]=max(famax[i][j-1],famax[i+(1<<(j-1))][j-1]);
				amin[i][j]=min(amin[i][j-1],amin[i+(1<<(j-1))][j-1]);
				zamin[i][j]=min(zamin[i][j-1],zamin[i+(1<<(j-1))][j-1]);
			}
		}
	}
	for(int j=1;j<=20;j++){
		for(int i=1;i<=m;i++){
			if (i+(1<<(j-1))<=m)
			{
				bmax[i][j]=max(bmax[i][j-1],bmax[i+(1<<(j-1))][j-1]);
				bmin[i][j]=min(bmin[i][j-1],bmin[i+(1<<(j-1))][j-1]);
			}
		}
	}
	while(q--)
	{

		cin>>l1>>r1>>l2>>r2;
		len1=log2(r1-l1+1);
		len2=log2(r2-l2+1);
		maxa=max(amax[l1][len1],amax[r1-(1<<len1)+1][len1]);
		mina=min(amin[l1][len1],amin[r1-(1<<len1)+1][len1]);
		minza=min(zamin[l1][len1],zamin[r1-(1<<len1)+1][len1]);
		maxfa=max(famax[l1][len1],famax[r1-(1<<len1)+1][len1]);
		maxb=max(bmax[l2][len2],bmax[r2-(1<<len2)+1][len2]);
		minb=min(bmin[l2][len2],bmin[r2-(1<<len2)+1][len2]);

		//1和3可以合并: 2只有负数,那么1选最小,2选最大
		if(maxb<=0) cout<<mina*maxb<<'\n';
		//2和4可以合并:2只有正数,那么1选最大,2选最小
		else if (minb>=0) cout<<maxa*minb<<'\n';
		//5.如果1只有负数,2有正有负,那么1选最大,2选最大
		else if (maxa<=0) cout<<maxa*maxb<<'\n';
		//6.如果1只有正数,2有正有负,那么1选最小,2选最小 
		else if (mina>=0) cout<<mina*minb<<'\n';
		//7.如果1有正有负,2有正有负,那么max((1正数的最小,2最小),(1负数的最大,2最大))
		else cout<<max(minza*minb,maxfa*maxb)<<'\n';
	}



	return 0;
}



2024/6/20 21:10
加载中...