为什么样例3没过结果a了
查看原帖
为什么样例3没过结果a了
154335
终末H楼主2022/11/1 15:52

考场上最后特判n<=1000直接跑暴力了

线段树都写错了为什么能A啊,洛谷和inf都是这样

#include<bits/stdc++.h>
using namespace std;
long long A[200000],B[200000];
int n,m,q;
struct node
{
	int l,r;
	long long mi,ma,zmi=INT_MAX,fma=INT_MIN;
} a[1000000],b[1000000];
struct m3
{
	long long mi=INT_MAX,ma=INT_MIN,zmi=INT_MAX,fma=INT_MIN;
};
long long lmax(long a,long b)
{
	return a>b?a:b;
}
long long lmin(long long a,long long b)
{
	return a<b?a:b;
}
long long labs(long long x)
{
	return x>0?x:-x;
}
void upm(m3 &a,m3 b)
{
	if(a.ma<b.ma)
	{
		a.ma=b.ma;
	}
	if(a.mi>b.mi)
	{
		a.mi=b.mi;
	}
	if(a.zmi>b.zmi)
	{
		a.zmi=b.zmi;
	}
	if(a.fma<b.fma)
	{
		a.fma=b.fma;
	}
	return;
}
void pushupa(int i)
{
	a[i].mi=lmin(a[i*2].mi,a[i*2+1].mi);
	a[i].ma=lmax(a[i*2].ma,a[i*2+1].ma);
	a[i].zmi=lmin(a[i*2].zmi,a[i*2+1].zmi);
	a[i].fma=lmax(a[i*2].fma,a[i*2+1].fma);
}
void pushupb(int i)
{
	b[i].mi=lmin(b[i*2].mi,b[i*2+1].mi);
	b[i].ma=lmax(b[i*2].ma,b[i*2+1].ma);
	b[i].zmi=lmin(b[i*2].zmi,b[i*2+1].zmi);
	b[i].fma=lmax(b[i*2].fma,b[i*2+1].fma);
}
void builda(int i,int l,int r)
{
	a[i].l=l;
	a[i].r=r;
	if(l==r)
	{
		a[i].mi=a[i].ma=A[l];
		if(A[l]>=0)
		{
			a[i].zmi=A[l];
		}
		if(A[l]<=0)
		{
			a[i].fma=A[l];
		}
		return;
	}
	int mid=(l+r)/2;
	builda(i*2,l,mid);
	builda(i*2+1,mid+1,r);
	pushupa(i);
	return;
}
void buildb(int i,int l,int r)
{
	b[i].l=l;
	b[i].r=r;
	if(l==r)
	{
		b[i].mi=b[i].ma=B[l];
		if(B[l]>=0)
		{
			b[i].zmi=B[l];
		}
		if(B[l]<=0)
		{
			b[i].fma=B[l];
		}
		return;
	}
	int mid=(l+r)/2;
	buildb(i*2,l,mid);
	buildb(i*2+1,mid+1,r);
	pushupb(i);
	return;
}
m3 qa(int i,int x,int y)
{
	m3 ate;
	if(x==y)
	{
		m3 tem;
		tem.mi=tem.ma=A[x];
		if(A[x]>=0)
		{
			tem.zmi=A[x];
		}
		if(A[x]<=0)
		{
			tem.fma=A[x];
		}
		return tem;
	}
	if(x==a[i].l&&y==a[i].r)
	{
		m3 tem;
		tem.mi=a[i].mi;
		tem.ma=a[i].ma;
		tem.zmi=a[i].zmi;
		tem.fma=a[i].fma;
		return tem;
	}
	if(x<=a[i*2].r)
	{
		ate=qa(i*2,x,min(a[i*2].r,y));
	}
	if(y>=a[i*2+1].l)
	{
		upm(ate,qa(i*2+1,max(a[i*2+1].l,x),y));
	}
	return ate;
}
m3 qb(int i,int x,int y)
{
	m3 bte;
	if(x==y)
	{
		m3 tem;
		tem.mi=tem.ma=B[x];
		if(B[x]>=0)
		{
			tem.zmi=B[x];
		}
		if(B[x]<=0)
		{
			tem.fma=B[x];
		}
		return tem;
	}
	if(x==b[i].l&&y==b[i].r)
	{
		m3 tem;
		tem.mi=b[i].mi;
		tem.ma=b[i].ma;
		tem.zmi=b[i].zmi;
		tem.fma=b[i].fma;
		return tem;
	}
	if(x<=b[i*2].r)
	{
		bte=qb(i*2,x,min(b[i*2].r,y));
	}
	if(y>=b[i*2+1].l)
	{
		upm(bte,qb(i*2+1,max(b[i*2+1].l,x),y));
	}
	return bte;
}
int main()
{
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	scanf("%d%d%d",&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);
	int l1,l2,r1,r2;
	for(int i=1; i<=q; i++)
	{
		m3 at,bt;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		if(n>1000)
		{
			at=qa(1,l1,r1);
			bt=qb(1,l2,r2);
		}
		else
		{
			for(int i=l1; i<=r1; i++)
			{
				at.ma=lmax(at.ma,A[i]);
				at.mi=lmin(at.mi,A[i]);
				if(A[i]>=0)
				{
					at.zmi=min(at.zmi,A[i]);
				}
				if(A[i]<=0)
				{
					at.fma=max(at.fma,A[i]);
				}
			}
			for(int i=l2; i<=r2; i++)
			{
				bt.ma=lmax(bt.ma,B[i]);
				bt.mi=lmin(bt.mi,B[i]);
				if(B[i]>=0)
				{
					bt.zmi=min(bt.zmi,B[i]);
				}
				if(B[i]<=0)
				{
					bt.fma=max(bt.fma,B[i]);
				}
			}
		}
		if(bt.ma<=0)
		{
			if(at.ma<=0)
			{
				printf("%lld\n",at.mi*bt.ma);
				continue;
			}
			if(at.mi>=0)
			{
				printf("%lld\n",at.mi*bt.mi);
				continue;
			}
			printf("%lld\n",at.mi*bt.ma);
			continue;
		}
		if(bt.mi>=0)
		{
			if(at.ma<=0)
			{
				printf("%lld\n",at.ma*bt.ma);
				continue;
			}
			if(at.mi>=0)
			{
				printf("%lld\n",at.ma*bt.mi);
				continue;
			}
			printf("%lld\n",at.ma*bt.mi);
			continue;
		}
		if(at.ma<=0)
		{
			printf("%lld\n",at.ma*bt.ma);
			continue;
		}
		if(at.mi>=0)
		{
			printf("%lld\n",at.mi*bt.mi);
			continue;
		}
		printf("%lld\n",at.zmi*bt.mi>at.fma*bt.ma?at.zmi*bt.mi:at.fma*bt.ma);
		continue;
	}
	return 0;
}

2022/11/1 15:52
加载中...