6ST表,样例3不过求助
查看原帖
6ST表,样例3不过求助
467906
Anyakwi楼主2022/10/31 20:37
#include<bits/stdc++.h>
using namespace std;
#define ll long long

inline int read()
{
	int x=0,f=1;
	char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-') f=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return x*f;
}

const int maxn=1e5+5;
int n,m,q;
int fa1[20][maxn],fa2[20][maxn],fa3[20][maxn],fa4[20][maxn],fb1[20][maxn],fb4[20][maxn];

int ask1(int l,int r,int p,int q)//p最大或最小,q正或负 
{
	int k=log2(r-l+1);
	if(p==1)
	{
		if(q>0) return max(fa1[k][l],fa1[k][r-(1<<k)+1]);
		else return max(fa3[k][l],fa3[k][r-(1<<k)+1]);
	}
	else
	{
		if(q>0) return min(fa2[k][l],fa2[k][r-(1<<k)+1]);
		else return min(fa4[k][l],fa4[k][r-(1<<k)+1]);
	}
}

int ask2(int l,int r,int p)
{
	int k=log2(r-l+1);
	if(p==1) return max(fb1[k][l],fb1[k][r-(1<<k)+1]);
	else return min(fb4[k][l],fb4[k][r-(1<<k)+1]);
}

int main()
{
//	freopen("game3.in","r",stdin);
//	freopen("ok.out","w",stdout);
	n=read(),m=read(),q=read();
	
	for(int i=0;i<=19;i++)
	for(int j=1;j<=max(n,m);j++)
	{
		fa1[i][j]=fa3[i][j]=fb1[i][j]=INT_MIN;
		fa2[i][j]=fa4[i][j]=fb4[i][j]=INT_MAX;
	}
	
	for(int i=1;i<=n;i++) 
	{
		int tmp=read();
//		fa1[0][i]=fa4[0][i]=tmp;
		if(tmp>=0) fa1[0][i]=fa2[0][i]=tmp;//?
		else fa3[0][i]=fa4[0][i]=tmp;
	}
	
	for(int i=1;i<=m;i++) fb1[0][i]=fb4[0][i]=read();
	
	for(int i=1;(1<<i)<=n;i++)
		for(int j=1;j+(1<<i)-1<=n;j++)
		{
			fa1[i][j]=max(fa1[i-1][j],fa1[i-1][j+(1<<(i-1))]);
			fa2[i][j]=min(fa2[i-1][j],fa2[i-1][j+(1<<(i-1))]);
			fa3[i][j]=max(fa3[i-1][j],fa3[i-1][j+(1<<(i-1))]);
			fa4[i][j]=min(fa4[i-1][j],fa4[i-1][j+(1<<(i-1))]);
		}
//	cout<<fa2[1][3]<<" "<<fa2[0][3]<<" "<<fa2[0][4]<<endl;
		
	for(int i=1;(1<<i)<=m;i++)
		for(int j=1;j+(1<<i)-1<=m;j++)
		{
			fb1[i][j]=max(fb1[i-1][j],fb1[i-1][j+(1<<(i-1))]);
			fb4[i][j]=min(fb4[i-1][j],fb4[i-1][j+(1<<(i-1))]);
		}
		
	for(int i=1;i<=q;i++)
	{
		int l1=read(),r1=read(),l2=read(),r2=read();
		int x=ask1(l1,r1,1,1),y=ask1(l1,r1,-1,1),z=ask1(l1,r1,1,-1),w=ask1(l1,r1,-1,-1);
		int c=ask2(l2,r2,1),d=ask2(l2,r2,-1);
//		cout<<x<<" "<<y<<" "<<z<<" "<<w<<endl;
		
		ll ans=LLONG_MIN;
		ans=max(ans,max(1ll*c*z,1ll*c*w));
		ans=max(ans,max(1ll*d*x,1ll*d*y));
		printf("%lld\n",ans);
	}	
	
	return 0;
}
/*
6 4 5
3 -1 -2 1 2 0
1 2 -1 -3
1 6 1 4
1 5 1 4
1 4 1 2
2 6 3 4
2 5 2 3
*/
2022/10/31 20:37
加载中...