求D
查看原帖
求D
1039274
Cypher_404楼主2024/2/23 11:58

我用的笨办法线段树,有点太长了。。。

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=500014;
#define mid ((l+r)>>1) 
int a[N],b[N],maxa[N<<2],mina[N<<2],ma[N<<2],fa[N<<2],maxb[N<<2],minb[N<<2],n,m,q;
void buildb(int k,int l,int r)
{
	if(l==r)
	{
		maxb[k]=b[l];
		minb[k]=b[l];
		return;
	}
	buildb(k<<1,l,mid);
	buildb(k<<1|1,mid+1,r);
	maxb[k]=max(maxb[k<<1],maxb[k<<1|1]);
	minb[k]=min(minb[k<<1],minb[k<<1|1]);
}
void builda(int k,int l,int r)
{
	if(l==r)
	{
		if(a[l]<0)fa[k]=a[l];
		else fa[k]=LONG_LONG_MIN;
		if(a[k]>=0)ma[k]=a[l];
		else ma[k]=LONG_LONG_MAX;
		maxa[k]=a[l];
		mina[k]=a[l];
		return;
	}
	builda(k<<1,l,mid);
	builda(k<<1|1,mid+1,r);
	maxa[k]=max(maxa[k<<1],maxa[k<<1|1]);
	mina[k]=min(mina[k<<1],mina[k<<1|1]);
	fa[k]=max(fa[k<<1],fa[k<<1|1]);
	ma[k]=min(ma[k<<1],ma[k<<1|1]);
}
int getamax(int k,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		return maxa[k];
	}
	int sum=LONG_LONG_MIN;
	if(x<=mid)
	{
		sum=max(sum,getamax(k<<1,l,mid,x,y));
	}
	if(y>mid)
	{
		sum=max(sum,getamax(k<<1|1,mid+1,r,x,y));
	}
	return sum;
}
int getbmax(int k,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		return maxb[k];
	}
	int sum=LONG_LONG_MIN;
	if(x<=mid)
	{
		sum=max(sum,getbmax(k<<1,l,mid,x,y));
	}
	if(y>mid)
	{
		sum=max(sum,getbmax(k<<1|1,mid+1,r,x,y));
	}
	return sum;
}
int getamin(int k,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		return mina[k];
	}
	int sum=LONG_LONG_MAX;
	if(x<=mid)
	{
		sum=min(sum,getamin(k<<1,l,mid,x,y));
	}
	if(y>mid)
	{
		sum=min(sum,getamin(k<<1|1,mid+1,r,x,y));
	}
	return sum;
}
int getbmin(int k,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		return minb[k];
	}
	int sum=LONG_LONG_MAX;
	if(x<=mid)
	{
		sum=min(sum,getbmin(k<<1,l,mid,x,y));
	}
	if(y>mid)
	{
		sum=min(sum,getbmin(k<<1|1,mid+1,r,x,y));
	}
	return sum;
}
int getaqumin(int k,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		return ma[k];
	}
	int sum=LONG_LONG_MAX;
	if(x<=mid)
	{
		sum=min(sum,getaqumin(k<<1,l,mid,x,y));
	}
	if(y>mid)
	{
		sum=min(sum,getaqumin(k<<1|1,mid+1,r,x,y));
	}
	return sum;
}
int getaqumax(int k,int l,int r,int x,int y)
{
	if(x<=l&&r<=y)
	{
		return fa[k];
	}
	int sum=LONG_LONG_MIN;
	if(x<=mid)
	{
		sum=max(sum,getaqumax(k<<1,l,mid,x,y));
	}
	if(y>mid)
	{
		sum=max(sum,getaqumax(k<<1|1,mid+1,r,x,y));
	}
	return sum;
}
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]);
	}
	builda(1,1,n);
	buildb(1,1,m);
	while(q--)
	{
		int x,y,xx,yy;
		scanf("%lld%lld%lld%lld",&x,&y,&xx,&yy);
		int mx,my,ans1=LONG_LONG_MIN;
		my=getbmin(1,1,m,xx,yy);
		if(my>=0)
		{
			mx=getamax(1,1,n,x,y);
			if(mx>=0)
				ans1=mx*my;
		}
		else
		{
			mx=getaqumin(1,1,n,x,y);
			if(mx>=0)
			ans1=max(ans1,mx*my);
		}
		my=getbmax(1,1,m,xx,yy);
		if(my>=0)
		{
			mx=getaqumin(1,1,n,x,y);
			if(x<0)
			{
				ans1=max(ans1,mx*my);
			}
		}
		else
		{
			mx=getamin(1,1,n,x,y);
			if(x<0)
			{
				ans1=max(ans1,mx*my);
			}
		}
		cout<<ans1<<'\n';
	}
	return 0;
}
2024/2/23 11:58
加载中...