ST表40pts求调
查看原帖
ST表40pts求调
739757
NOlAKME楼主2023/9/9 15:43
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define sp putchar(' ')
#define end putchar('\n')
#define INF 11451419111111111
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*10+ch-48;ch=getchar();}
	return x*f;
}
int a[100009][30],b[100009][30],c[100009][30],d[100009][30],e[100009][30],f[100009][30];
signed main(){
	//freopen("game4.in","r",stdin);
	int n=read(),m=read(),q=read();
	bool bf=0,af=0;
	for(int i=1;i<=n;i++){
		a[i][0]=read();
		if(a[i][0]==0) af=1;
		f[i][0]=e[i][0]=c[i][0]=a[i][0];
		if(a[i][0]>0) a[i][0]=INF;
		if(c[i][0]>0) c[i][0]=-INF;
		if(e[i][0]<0) e[i][0]=INF;
		if(f[i][0]<0) f[i][0]=-INF;
	}
	for(int i=1;i<=m;i++){
		b[i][0]=read();
		d[i][0]=b[i][0];
	}
	for(int i=1;i<=29;i++){ 
		for(int j=1;j<=n-(1<<i)+1;j++){
			a[j][i]=min(a[j][i-1],a[j+(1<<(i-1))][i-1]);
		}
	}
	for(int i=1;i<=29;i++){ 
		for(int j=1;j<=n-(1<<i)+1;j++){
			c[j][i]=max(c[j][i-1],c[j+(1<<(i-1))][i-1]);
		}
	}
	for(int i=1;i<=29;i++){ 
		for(int j=1;j<=n-(1<<i)+1;j++){
			e[j][i]=min(e[j][i-1],e[j+(1<<(i-1))][i-1]);
		}
	}
	for(int i=1;i<=29;i++){ 
		for(int j=1;j<=n-(1<<i)+1;j++){
			f[j][i]=max(f[j][i-1],f[j+(1<<(i-1))][i-1]);
		}
	}
	for(int i=1;i<=29;i++){ 
		for(int j=1;j<=m-(1<<i)+1;j++){
			b[j][i]=min(b[j][i-1],b[j+(1<<(i-1))][i-1]);
		}
	}
	for(int i=1;i<=29;i++){ 
		for(int j=1;j<=m-(1<<i)+1;j++){
			d[j][i]=max(d[j][i-1],d[j+(1<<(i-1))][i-1]);
		}
	}
	for(int i=1;i<=q;i++){
		int l=read(),r=read(),x=read(),y=read();
		int tmp1=log2(r-l+1),tmp2=log2(y-x+1);
		//f正最大,e正最小,c负最大,a负最小 
		//a负最大,b最大
		//a正最大,b最小
		//a正最小,b最小
		//a负最小,b最大
		/*if(a[i][0]>0) a[i][0]=INF;
		if(c[i][0]>0) c[i][0]=-INF;
		if(e[i][0]<0) e[i][0]=INF;
		if(f[i][0]<0) f[i][0]=-INF;*/
		//cout<<r-(1<<tmp2)+1<<endl<<"----------"<<endl; 
		int ans=-INF;
		int bmin=min(b[x][tmp2],b[y-(1<<tmp2)+1][tmp2]);
		int bmax=max(d[x][tmp2],d[y-(1<<tmp2)+1][tmp2]);
		int afmax=max(c[l][tmp1],c[r-(1<<tmp1)+1][tmp1]);
		int azmax=max(f[l][tmp1],f[r-(1<<tmp1)+1][tmp1]);
		int afmin=min(a[l][tmp1],a[r-(1<<tmp1)+1][tmp1]);
		int azmin=min(e[l][tmp1],e[r-(1<<tmp1)+1][tmp1]);
		
		if(afmin!=INF){
			ans=max(ans,afmin*bmax);
			//cout<<ans<<endl;
		}
		if(azmin!=INF){
			ans=max(ans,azmin*bmin);
			//cout<<ans<<endl;
		}
		if(afmax!=-INF){
			ans=max(ans,afmax*bmax);
			//cout<<ans<<endl;
		}
		if(azmax!=-INF){
			//cout<<bmin<<' '<<azmax<<endl;
			ans=max(ans,azmax*bmin);
		}
		printf("%lld\n",ans);
	}
	return 0;
}
2023/9/9 15:43
加载中...