题目求助玄关
  • 板块灌水区
  • 楼主ChenZQ
  • 当前回复0
  • 已保存回复0
  • 发布时间2024/10/8 19:14
  • 上次更新2024/10/8 21:07:51
查看原帖
题目求助玄关
745358
ChenZQ楼主2024/10/8 19:14

https://www.luogu.com.cn/problem/P8818

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

int n,m,q;
int a[100010],b[100010];
int mxf[100010][18],mxq[100010][18],miq[100010][18],mif[100010][18];
int mx[100010][18],mi[100010][18],lg[100010];
int main()
{
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++)
	{
		scanf("%d",&a[i]);
		mxq[i][0]=a[i];
		if(a[i]>=0) mxf[i][0]=-(int)1e9;
		else mxf[i][0]=a[i];
		miq[i][0]=a[i];
		if(a[i]<0) mif[i][0]=(int)1e9;
		else mif[i][0]=a[i];
	}
	for(int i=1;i<=m;i++)
	{
		scanf("%d",&b[i]);
		mx[i][0]=b[i];
		mi[i][0]=b[i];
	}
	lg[0]=-1;
	for(int i=1;i<=100000;i++)  lg[i]=lg[i>>1]+1;
	for(int j=1;j<=17;j++)
	{
		int lim=n-(1<<j)+1;
		for(int i=1;i<=lim;i++)
		{
			mxq[i][j]=max(mxq[i][j-1],mxq[i+(1<<(j-1))][j-1]);
			miq[i][j]=min(miq[i][j-1],miq[i+(1<<(j-1))][j-1]);
			mif[i][j]=min(mif[i][j-1],mif[i+(1<<(j-1))][j-1]);
			mxf[i][j]=max(mxf[i][j-1],mxf[i+(1<<(j-1))][j-1]);
		}
	}
	for(int j=1;j<=17;j++)
	{
		int lim=m-(1<<j)+1;
		for(int i=1;i<=lim;i++)
		{
			mx[i][j]=max(mx[i][j-1],mx[i+(1<<(j-1))][j-1]);
			mi[i][j]=min(mi[i][j-1],mi[i+(1<<(j-1))][j-1]);
		}
	}
	while(q--)
	{
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		int l=lg[r1-l1+1];
		int x=max(mxq[l1][l],mxq[r1-(1<<l)+1][l]);
		int y=max(mxf[l1][l],mxq[r1-(1<<l)+1][l]);
		int z=min(miq[l1][l],miq[r1-(1<<l)+1][l]);
		int h=min(mif[l1][l],mif[r1-(1<<l)+1][l]);
		l=lg[r2-l2+1];
		int xx=max(mx[l2][l],mx[r2-(1<<l)+1][l]);
		int yy=min(mi[l2][l],mi[r2-(1<<l)+1][l]);
		int ans=(int)-1e9;
		if(x>=0) ans=max(ans,x*yy);
		if(h!=(int)1e9) ans=max(ans,h*yy);
		if(y<0) ans=max(ans,y*xx);
		if(z<0) ans=max(ans,z*xx);
		printf("%d\n",ans);
	}
} 
2024/10/8 19:14
加载中...