官方数据85求调WA#23#30#37,是哪分类讨论没顾及到吗?
查看原帖
官方数据85求调WA#23#30#37,是哪分类讨论没顾及到吗?
617065
Ovine楼主2022/11/14 19:42
#include<iostream>
#include<cstdio>
#include<algorithm>
#define int long long
using namespace std;
const int MAXN=1e5+6;
int n,m,q;
struct node{
	int l,r,max,min;
	int zabs,fabs;
	bool z;	
}f1[MAXN*4+2],f2[MAXN*4+5];
int a[MAXN],b[MAXN];

int max(int a,int b)
{
	if(a>b) return a;
	return b;
}

int min(int a,int b)
{
	if(a<b) return a;
	return b;
}

void build1(int p,int x,int y)
{
	f1[p].l=x;
	f1[p].r=y;
	if(x==y)
	{
		f1[p].max=a[x];
		f1[p].min=a[x];
		if(a[x]>0)
		{
			f1[p].zabs=a[x];
		}
		if(a[x]==0)
		{
			f1[p].z=1;
		}
		if(a[x]<0)
		{
			f1[p].fabs=a[x];
		}
		return;
	}
	int mid=(x+y)>>1;
	build1(p*2,x,mid);
	build1(p*2+1,mid+1,y);
	f1[p].max=max(f1[p*2].max,f1[p*2+1].max);
	f1[p].min=min(f1[p*2].min,f1[p*2+1].min);
	f1[p].zabs=min(f1[p*2].zabs,f1[p*2+1].zabs);
	f1[p].fabs=max(f1[p*2].fabs,f1[p*2+1].fabs);
	f1[p].z=f1[p*2].z|f1[p*2+1].z;
}

void build2(int p,int x,int y)
{
	f2[p].l=x;
	f2[p].r=y;
	if(x==y)
	{
		f2[p].max=b[x];
		f2[p].min=b[x];
		if(b[x]>0)
		{
			f2[p].zabs=b[x];
		}
		if(b[x]==0)
		{
			f2[p].z=1;
		}
		if(b[x]<0)
		{
			f2[p].fabs=b[x];
		}
		return;
	}
	int mid=(x+y)>>1;
	build2(p*2,x,mid);
	build2(p*2+1,mid+1,y);
	f2[p].max=max(f2[p*2].max,f2[p*2+1].max);
	f2[p].min=min(f2[p*2].min,f2[p*2+1].min);
	f2[p].zabs=min(f2[p*2].zabs,f2[p*2+1].zabs);
	f2[p].fabs=max(f2[p*2].fabs,f2[p*2+1].fabs);
	f2[p].z=f2[p*2].z|f2[p*2+1].z;
}

int max1,max2,min1,min2,z1,z2,zabs1,zabs2,fabs1,fabs2;

void ask1(int p,int x,int y)
{
	if(f1[p].l>=x&&f1[p].r<=y)
	{
		max1=max(max1,f1[p].max);
		min1=min(min1,f1[p].min);
		zabs1=min(zabs1,f1[p].zabs);
		fabs1=max(fabs1,f1[p].fabs);
		z1=z1|f1[p].z;	
		return;
	}
	int mid=(f1[p].l+f1[p].r)>>1;
	if(x<=mid) ask1(p*2,x,y);
	if(y>mid) ask1(p*2+1,x,y);
}	

void ask2(int p,int x,int y)
{
	if(f2[p].l>=x&&f2[p].r<=y)
	{
		max2=max(max2,f2[p].max);
		min2=min(min2,f2[p].min);
		zabs2=min(zabs2,f2[p].zabs);
		fabs2=max(fabs2,f2[p].fabs);
		z2=z2|f2[p].z;
		return ;
	}
	int mid=(f2[p].l+f2[p].r)>>1;
	if(x<=mid) ask2(p*2,x,y);
	if(y>mid) ask2(p*2+1,x,y);
}

signed main()
{
	scanf("%lld%lld%lld",&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]);
	int t;
	n>m?t=n:t=m;
	
	for(int i=1;i<=t*4;i++)
	{
		f1[i].min=1e10-8;
		f2[i].min=1e10-8;
		f1[i].zabs=1e10-8;
		f1[i].fabs=-1e10-8;
		f2[i].zabs=1e10-8;
		f2[i].fabs=-1e10-8;
		f1[i].max=-1e10+8;
		f2[i].max=-1e10+8;
	}

	build1(1,1,n);
	build2(1,1,m);
	int x1,y1,x2,y2;
	for(int i=1;i<=q;i++)
	{
		scanf("%lld%lld%lld%lld",&x1,&y1,&x2,&y2);
		max1=-1e10+8;
		max2=-1e10+8;
		min1=1e10-8;
		min2=1e10-8;
		z1=0;
		z2=0;
		zabs1=1e10+8;
		zabs2=1e10+8;
		fabs1=-1e10+8;
		fabs2=-1e10+8;
		
		ask1(1,x1,y1);
		ask2(1,x2,y2);
		
		if(min2>0)
		{
			if(max1>0)
			{
				if(z2==1)
				{
					cout<<0<<endl;
					continue;
				}
				cout<<max1*min2<<endl;
				continue;
			}
			if(max1<0)
			{
				if(z1==1)
				{
					cout<<0<<endl;
					continue;
				}
				cout<<max1*max2<<endl; 
				continue;
			}
		}
		if(max2<0)
		{
			if(min1<0)
			{
				if(z2==1)
				{
					cout<<0<<endl;
					continue;
				}
				cout<<min1*max2<<endl;
				continue;
			}
			if(min1>0)
			{
				if(z1==1)
				{
					cout<<0<<endl;
					continue;
				}
				cout<<min1*min2<<endl;
				continue;
			}
		}
		if(max2>0&&min2<0)
		{
			if(z1==1)
			{
				cout<<0<<endl;
				continue;
			}
			if(max1<0)
			{
				cout<<max1*max2<<endl;
				continue;
			}
			if(min1>0)
			{
				cout<<min1*min2<<endl;
				continue;
			}
			if(max1>0&&min1<0)
			{
				int ans=-1e18+8;
		
				ans=max(fabs1*max2,zabs1*min2);
			
				cout<<ans<<endl;
				continue;
			}
		}
	}
	return 0;
}
2022/11/14 19:42
加载中...