85分 求助
查看原帖
85分 求助
542879
_HCl_楼主2023/10/12 15:52

萌新刚学OI,低级错误请见谅

#include<bits/stdc++.h>
using namespace std;
int n,m,q;
long long a[100001],b[100001],zcnta[100001],zcntb[100001],stamx[100001][22],stbmx[100001][22],
stamn[100001][22],stbmn[100001][22],nstamx[100001][22],pstamn[100001][22];
void init()
{
	for(int j=1;j<=21;++j)
	{
		for(int i=1;i+(1<<j)-1<=n;++i)
		{
			stamx[i][j]=max(stamx[i][j-1],stamx[i+(1<<j-1)][j-1]);
			stamn[i][j]=min(stamn[i][j-1],stamn[i+(1<<j-1)][j-1]);
			nstamx[i][j]=max(nstamx[i][j-1],nstamx[i+(1<<j-1)][j-1]);
			pstamn[i][j]=min(pstamn[i][j-1],pstamn[i+(1<<j-1)][j-1]);
		}
	}
	for(int j=1;j<=21;++j)
	{
		for(int i=1;i+(1<<j)-1<=m;++i)
		{
			stbmx[i][j]=max(stbmx[i][j-1],stbmx[i+(1<<j-1)][j-1]);
			stbmn[i][j]=min(stbmn[i][j-1],stbmn[i+(1<<j-1)][j-1]);
		}
	}
}
void input()
{
	cin>>n>>m>>q;
	for(int i=1;i<=n;++i)
	{
		scanf("%lld",a+i);
		stamx[i][0]=stamn[i][0]=a[i];
		pstamn[i][0]=a[i]>0?a[i]:1e18;
		nstamx[i][0]=a[i]<0?a[i]:-1e18;
		if(a[i]==0)zcnta[i]=zcnta[i-1]+1;
		else zcnta[i]=zcnta[i-1];
	}
	for(int i=1;i<=m;++i)
	{
		scanf("%lld",b+i);
		stbmx[i][0]=stbmn[i][0]=b[i];
		if(b[i]==0)zcntb[i]=zcntb[i-1]+1;
		else zcntb[i]=zcntb[i-1];
	}
}

long long work(int l1,int r1,int l2,int r2)
{
	int A0=(bool(zcnta[r1]-zcnta[l1-1])),                                                                  
	Ap=(bool(max(stamx[l1][(int)log2(r1-l1+1)],stamx[r1-(1<<(int)log2(r1-l1+1))+1][(int)log2(r1-l1+1)])>0)),
	An=(bool(min(stamn[l1][(int)log2(r1-l1+1)],stamn[r1-(1<<(int)log2(r1-l1+1))+1][(int)log2(r1-l1+1)])<0)),
	B0=(bool(zcntb[r2]-zcntb[l2-1]))                                                                       ,
	Bp=(bool(max(stbmx[l2][(int)log2(r2-l2+1)],stbmx[r2-(1<<(int)log2(r2-l2+1))+1][(int)log2(r2-l2+1)])>0)),
	Bn=(bool(min(stbmn[l2][(int)log2(r2-l2+1)],stbmn[r2-(1<<(int)log2(r2-l2+1))+1][(int)log2(r2-l2+1)])<0));
	long long Amax=max(stamx[l1][(int)log2(r1-l1+1)],stamx[r1-(1<<(int)log2(r1-l1+1))+1][(int)log2(r1-l1+1)])  ,
	Amin=min(stamn[l1][(int)log2(r1-l1+1)],stamn[r1-(1<<(int)log2(r1-l1+1))+1][(int)log2(r1-l1+1)])  ,
	Bmax=max(stbmx[l2][(int)log2(r2-l2+1)],stbmx[r2-(1<<(int)log2(r2-l2+1))+1][(int)log2(r2-l2+1)])  ,
	Bmin=min(stbmn[l2][(int)log2(r2-l2+1)],stbmn[r2-(1<<(int)log2(r2-l2+1))+1][(int)log2(r2-l2+1)])  ,
	Apmn=min(pstamn[l1][(int)log2(r1-l1+1)],pstamn[r1-(1<<(int)log2(r1-l1+1))+1][(int)log2(r1-l1+1)]),
	Anmx=max(nstamx[l1][(int)log2(r1-l1+1)],nstamx[r1-(1<<(int)log2(r1-l1+1))+1][(int)log2(r1-l1+1)]);
//	cout<<Amax<<" "<<Amin<<" "<<Bmax<<" "<<Bmin<<" "<<Apmn<<" "<<Anmx<<"\n";
	if((A0&&!Ap&&!An)||(B0&&!Bp&&!Bn))return 0ll;
	else if(!A0&&Ap&&!An)
	{
		if(Bn)return Amin*Bmin;
		else return Amax*Bmin;
	}
	else if(!A0&&!Ap&&An)
	{
		if(Bp)return Amax*Bmax;
		else return Amin*Bmax;
	}
	else if(!A0&&Ap&&An)
	{
		if(Bp&&!Bn)return Amax*Bmin;
		else if(!Bp&&Bn)return Amin*Bmax;
		else return max(Apmn*Bmin,Anmx*Bmax);
	}
	else if(A0&&Ap&&!An)
	{
		if(Bn)return 0ll;
		else return Amax*Bmin;
	}
	else if(A0&&!Ap&&An)
	{
		if(Bp)return 0ll;
		else return Amin*Amax;
	}
	else
	{
		if(Bp&&!Bn)return Amax*Bmax;
		else if(!Bp&&Bn)return Amin*Bmax;
		else return 0ll;
	}
}
int main()
{
	input();
	init();
	for(int i=1;i<=q;++i)
	{
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		cout<<work(l1,r1,l2,r2)<<"\n";
	}
}
2023/10/12 15:52
加载中...