线段树,大样例过了,但是WA50分
查看原帖
线段树,大样例过了,但是WA50分
164700
金苹果gold楼主2022/10/29 22:51

rt

#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')
			f=-f;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=x*10+ch-'0';
		ch=getchar();
	}
	return x*f;
}
void write(int x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>=10)
		write(x/10);
	putchar(x%10+'0');
}
struct Wryyyyy{
	int l,r,sum;
};
Wryyyyy amaxtree[400010],amintree[400010],bmaxtree[400010],bmintree[400010],treezero1[400010],treezero2[400010];
int a[100010],b[100010];
void builda(int n,int l,int r)
{
	amaxtree[n].l=l;
	amaxtree[n].r=r;
	amintree[n].l=l;
	amintree[n].r=r;
	treezero1[n].l=l;
	treezero1[n].r=r;
	treezero2[n].l=l;
	treezero2[n].r=r;
	if(l==r)
	{
		amaxtree[n].sum=a[l];
		amintree[n].sum=a[l];
		treezero1[n].sum=a[l];
		treezero2[n].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	builda(n*2,l,mid);
	builda((n*2)|1,mid+1,r);
	amaxtree[n].sum=max(amaxtree[n*2].sum,amaxtree[(n*2)|1].sum);
	amintree[n].sum=min(amintree[n*2].sum,amintree[(n*2)|1].sum);
	int tmp;
	if(treezero1[n*2].sum<=0&&treezero1[(n*2)|1].sum>=0)
		treezero1[n].sum=treezero1[(n*2)|1].sum;
	else if(treezero1[n*2].sum>=0&&treezero1[(n*2)|1].sum<=0)
		treezero1[n].sum=treezero1[n*2].sum;
	else if(abs(treezero1[n*2].sum)<abs(treezero1[(n*2)|1].sum))
		treezero1[n].sum=treezero1[n*2].sum;
	else
		treezero1[n].sum=treezero1[(n*2)|1].sum;
	if(treezero2[n*2].sum<=0&&treezero2[(n*2)|1].sum>=0)
		treezero2[n].sum=treezero2[n*2].sum;
	if(treezero2[n*2].sum>=0&&treezero2[(n*2)|1].sum<=0)
		treezero2[n].sum=treezero2[(n*2)|1].sum;
	else if(abs(treezero2[n*2].sum)<abs(treezero2[(n*2)|1].sum))
		treezero2[n].sum=treezero2[n*2].sum;
	else
		treezero2[n].sum=treezero2[(n*2)|1].sum;
}
void buildb(int n,int l,int r)
{
	bmaxtree[n].l=l;
	bmaxtree[n].r=r;
	bmintree[n].l=l;
	bmintree[n].r=r;
	if(l==r)
	{
		bmaxtree[n].sum=b[l];
		bmintree[n].sum=b[l];
		return;
	}
	int mid=(l+r)>>1;
	buildb(n*2,l,mid);
	buildb((n*2)|1,mid+1,r);
	bmaxtree[n].sum=max(bmaxtree[n*2].sum,bmaxtree[(n*2)|1].sum);
	bmintree[n].sum=min(bmintree[n*2].sum,bmintree[(n*2)|1].sum);
}
int afind_maxn(int n,int l,int r)
{
	if(amaxtree[n].l>=l&&amaxtree[n].r<=r)
		return amaxtree[n].sum;
	if(amaxtree[n].r<l||amaxtree[n].l>r)
		return -INT_MAX+10;
	return max(afind_maxn(n*2,l,r),afind_maxn((n*2)|1,l,r));
}
int afind_minn(int n,int l,int r)
{
	if(amintree[n].l>=l&&amintree[n].r<=r)
		return amintree[n].sum;
	if(amintree[n].r<l||amintree[n].l>r)
		return INT_MAX-10;
	return min(afind_minn(n*2,l,r),afind_minn((n*2)|1,l,r));
}
int bfind_maxn(int n,int l,int r)
{
	if(bmaxtree[n].l>=l&&bmaxtree[n].r<=r)
		return bmaxtree[n].sum;
	if(bmaxtree[n].r<l||bmaxtree[n].l>r)
		return -INT_MAX+10;
	return max(bfind_maxn(n*2,l,r),bfind_maxn((n*2)|1,l,r));
}
int bfind_minn(int n,int l,int r)
{
	if(bmintree[n].l>=l&&bmintree[n].r<=r)
		return bmintree[n].sum;
	if(bmintree[n].r<l||bmintree[n].l>r)
		return INT_MAX-10;
	return min(bfind_minn(n*2,l,r),bfind_minn((n*2)|1,l,r));
}
int find_zero1(int n,int l,int r)
{
	if(treezero1[n].l>=l&&treezero1[n].r<=r)
		return treezero1[n].sum;
	if(treezero1[n].l>r||treezero1[n].r<l)
		return -INT_MAX+10;
	int tmp1=find_zero1(n*2,l,r);
	int tmp2=find_zero1((n*2)|1,l,r);
	if(tmp1<=0&&tmp2>=0)
		return tmp2;
	else if(tmp1>=0&&tmp2<=0)
		return tmp1;
	else if(abs(tmp1)<abs(tmp2))
		return tmp1;
	else
		return tmp2;
}
int find_zero2(int n,int l,int r)
{
	if(treezero2[n].l>=l&&treezero2[n].r<=r)
		return treezero2[n].sum;
	if(treezero2[n].l>r||treezero2[n].r<l)
		return INT_MAX-10;
	int tmp1=find_zero2(n*2,l,r);
	int tmp2=find_zero2((n*2)|1,l,r);
	if(tmp1<=0&&tmp2>=0)
		return tmp1;
	else if(tmp1>=0&&tmp2<=0)
		return tmp2;
	else if(abs(tmp1)<abs(tmp2))
		return tmp1;
	else
		return tmp2;
}
int n,m,k,l1,r1,l2,r2;
bool high_=true;
void init()
{
	n=read();
	m=read();
	k=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		if(a[i]<0)
			high_=false;
	}
	builda(1,1,n);
	for(int i=1;i<=m;i++)
	{
		b[i]=read();
		if(b[i]<0)
			high_=false;
	}
	buildb(1,1,m);
}
signed main()
{
	freopen("game.in","r",stdin);
	freopen("game.out","w",stdout);
	init();
	while(k--)
	{
		l1=read();
		r1=read();
		l2=read();
		r2=read();
		if(high_)
		{
			int ans=afind_maxn(1,l1,r1)*bfind_minn(1,l2,r2);
			if(ans!=0)
				write(ans);
			else
				putchar('0');
			putchar('\n');
		}
		else if(l1==r1)
		{
			int ans;
			if(a[l1]==0)
				ans=0;
			if(a[l1]>0)
				ans=a[l1]*bfind_minn(1,l2,r2);
			if(a[l1]<0)
				ans=a[l1]*bfind_maxn(1,l2,r2);
			if(ans!=0)
				write(ans);
			else
				putchar('0');
			putchar('\n');
		}
		else if(l2==r2)
		{
			int ans;
			if(b[l2]==0)
				ans=0;
			if(b[l2]>0)
				ans=b[l2]*afind_maxn(1,l2,r2);
			if(b[l2]<0)
				ans=b[l2]*afind_minn(1,l2,r2);
			if(ans!=0)
				write(ans);
			else
				putchar('0');
			putchar('\n');
		}
		else
		{
			int maxa=afind_maxn(1,l1,r1);
			int mina=afind_minn(1,l1,r1);
			int maxb=bfind_maxn(1,l2,r2);
			int minb=bfind_minn(1,l2,r2);
			int za1=find_zero1(1,l1,r1);
			int za2=find_zero2(1,l1,r1);
			int ans;
			if(maxb>=0&&minb<=0)
			{
				if(za1>0&&za2<0)
					ans=max(za1*minb,za2*maxb);
				if(za1==0||za2==0)
					ans=0;
				if(za1>0&&za2>0)
					ans=max(za1*minb,za2*minb);
				if(za1<0&&za2<0)
					ans=max(za1*maxb,za2*maxb);
				if(ans!=0)
					write(ans);
				else
					putchar('0');
				putchar('\n');
			}
			else if(maxb>0&&minb>0)
			{
				ans=afind_maxn(1,l1,r1)*bfind_minn(1,l2,r2);
				if(ans!=0)
					write(ans);
				else
					putchar('0');
				putchar('\n');
			}
			else if(maxb<0&&minb<0)
			{
				ans=afind_minn(1,l1,r1)*maxb;
				if(ans!=0)
					write(ans);
				else
					putchar('0');
				putchar('\n');
			}
		}
	}
	return 0;
}
2022/10/29 22:51
加载中...