45pts求助 悬赏关注 有思路
查看原帖
45pts求助 悬赏关注 有思路
749714
xyzfrozen楼主2022/11/1 17:14

开4个st

f5 f6 q5 q6没用

维护a 最大最小 f1 f3

b 最大最小 f2 f4

然后根据情况讨论

ac 1 2 6 7 8 12 13 14 15

#include<bits/stdc++.h>
#define int long long
using namespace std;

const int N=1e5+10;
int n,m,q,l1,l2,r1,r2,t1,t2;
int f1[N][20],f2[N][20],f3[N][20],f4[N][20],f5[N][20],f6[N][20];
int a[N],b[N];
//a 最大 b 最大
//a 最小 b 最小
//a 中是否有0 b 中是否有0
//第一个大于0 第一个小于0

int fr()
{
	int x=0,flag=1;
	char ch=getchar();
	while(ch<'0' || ch>'9')
	{
		if(ch=='-') flag=-1;
		ch=getchar();
	}
	while(ch>='0' && ch<='9')
	{
		x=x*10+(ch-'0');
		ch=getchar();
	}
	return x*flag;
}

int qt1(int lf,int rt) //a最大
{
	int li=log2(rt-lf+1);
	return max(f1[lf][li],f1[rt-(1<<li)+1][li]);
}

int qt2(int lf,int rt) //a最小
{
	int li=log2(rt-lf+1);
	return min(f3[lf][li],f3[rt-(1<<li)+1][li]);
}

int qt3(int lf,int rt) //b最大
{
	int li=log2(rt-lf+1);
	return max(f2[lf][li],f2[rt-(1<<li)+1][li]);
}

int qt4(int lf,int rt) //b最小
{
	int li=log2(rt-lf+1);
	return min(f4[lf][li],f4[rt-(1<<li)+1][li]);
}

int qt5(int lf,int rt)
{
	int li=log2(rt-lf+1);
	return max(f5[lf][li],f5[rt-(1<<li)+1][li]);
}

int qt6(int lf,int rt)
{
	int li=log2(rt-lf+1);
	return max(f6[lf][li],f6[rt-(1<<li)+1][li]);
}

void fw(int x)
{
	if(x>9) fw(x/10);
	putchar(x%10+'0');
}

bool check(int lf,int rt) //判断区间是否有0
{
	t1=1e9+10,t2=-1e9-10;
	for(int i=lf;i<=rt;i++)
	{
		if(!a[i]) return 1;
		if(a[i]>0) t1=min(t1,a[i]); //第一个大于0
		if(a[i]<0) t2=max(t2,a[i]); //第一个小于0
	}
	return  0;
}

signed main()
{
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++) f1[i][0]=fr(),a[i]=f1[i][0];
	for(int i=1;i<=m;i++) f2[i][0]=fr(),b[i]=f2[i][0];
	
	for(int k=1;(1<<k)<=n;k++)
	   for(int i=1;(1<<k)+i-1<=n;i++)
	      f1[i][k]=max(f1[i][k-1],f1[i+(1<<(k-1))][k-1]);
	      
	for(int k=1;(1<<k)<=m;k++)
	   for(int i=1;(1<<k)+i-1<=m;i++)
		  f2[i][k]=max(f2[i][k-1],f2[i+(1<<(k-1))][k-1]);
	
	for(int i=1;i<=n;i++) f3[i][0]=f1[i][0];
	for(int i=1;i<=m;i++) f4[i][0]=f2[i][0];
	
	for(int k=1;(1<<k)<=n;k++)
	   for(int i=1;(1<<k)+i-1<=n;i++)
		  f3[i][k]=min(f3[i][k-1],f3[i+(1<<(k-1))][k-1]);
	
	for(int k=1;(1<<k)<=m;k++)
	   for(int i=1;(1<<k)+i-1<=m;i++)
		  f4[i][k]=min(f4[i][k-1],f4[i+(1<<(k-1))][k-1]);
		  
	for(int i=1;i<=n;i++) if(!f1[i][0]) f5[i][0]=1;
	for(int i=1;i<=m;i++) if(!f2[i][0]) f6[i][0]=1;
		  
	for(int k=1;(1<<k)<=n;k++)
	   for(int i=1;(1<<k)+i-1<=n;i++)
	      f5[i][k]=max(f5[i][k-1],f5[i+(1<<(k-1))][k-1]);
		  
	for(int k=1;(1<<k)<=m;k++)
	   for(int i=1;(1<<k)+i-1<=m;i++)
	      f6[i][k]=max(f6[i][k],f6[i+(1<<(k-1))][k-1]);
	
	while(q--)
	{
		l1=fr(),r1=fr(),l2=fr(),r2=fr();
		int max1=qt1(l1,r1),min1=qt2(l1,l1);
		int max2=qt3(l2,r2),min2=qt4(l2,r2);
		
		if(min2>=0)
		{
			if(max1<0) fw(max1*max2),puts("");
			if(max1==0) puts("0");
			if(max1>0) fw(max1*min2),puts("");
		}
		
		else if(min2<0 && max2>0)
		{
			if(max1<0) fw(max1*max2),puts("");
			if(max1==0) puts("0");
			if(max1>0)
			{
				if(check(l1,r1)) puts("0");
				else printf("%lld\n",max(t1*min2,t2*max2));
			}
		}
		
		else if(min2<0 && max2==0)
		{
			if(max1<0) puts("0");
			if(max1==0) puts("0");
			if(max1>0) puts("0");
		}
		
		else if(min2<0 && max2<0)
		{
			if(max1<0) fw(min1*max2),puts("");
			if(max1==0) fw(min1*max2),puts("");
			if(max1>0) fw(min1*max2),puts("");
		}
	}

	return 0;
}
2022/11/1 17:14
加载中...