0分求调
查看原帖
0分求调
375403
NASFsky楼主2023/7/12 15:19

用的是题解区第一位的方法,两个样例都能过但是爆零

//省略次要代码
int f1[N][20];//xmin
int f2[N][20];//xmax
int f3[N][20];//ymin
int f4[N][20];//ymax
int f5[N][20];//xmin>=0
int f6[N][20];//xmax<0
//省略次要代码
int main()
{
	scanf("%d%d%d",&n,&m,&q);
	for(int i=2;i<=N;i++)_log2[i]=_log2[i>>1]+1;
	for(int i=1;i<=n;i++)
	{
		scanf("%d",a+i);
		f1[i][0]=f2[i][0]=a[i];
		if(a[i]>=0)
		{
			f5[i][0]=a[i];
			f6[i][0]=-0x3f3f3f3f;
		}
		else
		{
			f5[i][0]=0x3f3f3f3f;
			f6[i][0]=a[i];
		}
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d",b+i);
		f3[i][0]=f4[i][0]=b[i];
	}
	for(int j=1;j<=20;j++)
	{
		for(int i=1;i+(1<<j)-1<=n;i++)
		{
			f1[i][j]=min(f1[i][j-1],f1[i+(1<<(j-1))][j-1]);
			f2[i][j]=max(f2[i][j-1],f2[i+(1<<(j-1))][j-1]);
			f3[i][j]=min(f3[i][j-1],f3[i+(1<<(j-1))][j-1]);
			f4[i][j]=max(f4[i][j-1],f4[i+(1<<(j-1))][j-1]);
			f5[i][j]=min(f5[i][j-1],f5[i+(1<<(j-1))][j-1]);
			f6[i][j]=max(f6[i][j-1],f6[i+(1<<(j-1))][j-1]);
		 } 
	}
	int l1,r1,l2,r2,x,y,ans;
//	cout<<query1(1,3)<<endl; 
	while(q--)
	{
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		ans=-0x3f3f3f3f;
		 if(query2(l1,r1)>=0)//xmax 
		 {
		 	y=query3(l2,r2);//ymin
		 	if(y>=0)x=query2(l1,r1);//xmax
		 	else x=query5(l1,r1);//xmin>=0
//		 	printf("%d %d\n",x,y);
			ans=max(ans,x*y);
		 }
		 if(query1(l1,r1)<0)//xmin
		 {
		 	y=query4(l2,r2);//ymax
		 	if(y>=0)x=query6(l1,r1);//xmax
		 	else x=query1(l1,r1);//xmin
//		 	printf("%d %d\n",x,y);
			ans=max(ans,x*y);
		 }
		 printf("%d\n",ans);
	}
	return 0;
}
2023/7/12 15:19
加载中...