65 求助
查看原帖
65 求助
1025002
Hickey__unique楼主2023/8/9 11:16
#include <cstdio>
#include <iostream>
#include <cmath>
#define ll long long
using namespace std;
const int MAX=100010;
const ll MAXX=pow(2,63)-1;
ll n,m,q,l1,r1,l2,r2;
ll lg[MAX],fa_ma[MAX][20],fa_mi[MAX][20],fb_ma[MAX][20],fb_mi[MAX][20];
ll a_max,a_min,b_max,b_min;

int main()
{
	scanf("%lld%lld%lld",&n,&m,&q);
	lg[1]=0;
	for(int i=2;i<=max(m,n);i++) lg[i]=lg[i>>1]+1;
	for(int i=1;i<=n;i++) 
	{
		scanf("%lld",&fa_ma[i][0]);
		fa_mi[i][0]=fa_ma[i][0];
	}
	for(int j=1;j<=lg[n];j++)
	{
		for(int i=1;i+(1<<j)-1<=n;i++) 
		{
			fa_ma[i][j]=max(fa_ma[i][j-1],fa_ma[i+(1<<(j-1))][j-1]);
			fa_mi[i][j]=min(fa_mi[i][j-1],fa_mi[i+(1<<(j-1))][j-1]);
		} 
	}
	for(int i=1;i<=m;i++) 
	{
		scanf("%lld",&fb_ma[i][0]);
		fb_mi[i][0]=fb_ma[i][0];
	}
	for(int j=1;j<=lg[m];j++)
	{
		for(int i=1;i+(1<<j)-1<=m;i++) 
		{
			fb_ma[i][j]=max(fb_ma[i][j-1],fb_ma[i+(1<<(j-1))][j-1]);
			fb_mi[i][j]=min(fb_mi[i][j-1],fb_mi[i+(1<<(j-1))][j-1]);
		} 
	}
	for(int i=1;i<=q;i++)
	{
		scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
		int pa=lg[r1-l1+1],pb=lg[r2-l2+1];
		a_max=max(fa_ma[l1][pa],fa_ma[r1-(1<<pa)+1][pa]);
		a_min=min(fa_mi[l1][pa],fa_mi[r1-(1<<pa)+1][pa]);
		b_max=max(fb_ma[l2][pb],fb_ma[r2-(1<<pb)+1][pb]);
		b_min=min(fb_mi[l2][pb],fb_mi[r2-(1<<pb)+1][pb]);
		if(a_min>=0) 
		{
			if(b_min>=0) printf("%lld\n",a_max*b_min);
			else if(b_max<=0) printf("%lld\n",a_min*b_min);
			else printf("%lld\n",b_min*a_min);
		} 
		else if(a_max<=0)
		{
			if(b_min>=0) printf("%lld\n",b_max*a_max);
			else if(b_max<=0) printf("%lld\n",a_min*b_max);
			else printf("%lld\n",b_max*a_max);
		}
		else 
		{
			if(b_min>=0) printf("%lld\n",a_max*b_min);
			else if(b_max<=0) printf("%lld\n",a_min*b_max);
			else 
			{
				int flag=0;
				for(int i=l1;i<=r1;i++)
				{
					if(fa_ma[i][0]==0)
					{
						flag=1;
						break;
					}
				}
				if(flag==1) 
				{
					printf("0\n");
					continue;
			    }
			    int a_mi_=-MAXX,a_ma_=MAXX;
			    for(int i=l1;i<=r1;i++)
			    {
			    	if(fa_ma[i][0]<0&&fa_ma[i][0]>a_mi_) a_mi_=fa_ma[i][0];
			    	if(fa_ma[i][0]>0&&fa_ma[i][0]<a_ma_) a_ma_=fa_ma[i][0];
				}
				printf("%lld\n",-min(-a_mi_*b_max,-a_ma_*b_min));
			}
		}
	}
	return 0;
}
2023/8/9 11:16
加载中...