40分st表求助
查看原帖
40分st表求助
981822
_liukelin_楼主2024/3/19 20:25
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int maxn=1e5+5;
const int inf=2e18;
int a[maxn],b[maxn],st1[maxn][50],st2[maxn][50],st3[maxn][50],st4[maxn][50],st5[maxn][50],st6[maxn][50]; 
int n,m,q;

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

void st_create(){
	for(int i=1;i<=n;i++){
		st1[i][0]=a[i];
		st2[i][0]=a[i];
		if(a[i]>=0){
			st3[i][0]=inf;
		} 
		else{
			st3[i][0]=a[i];
		}
		if(a[i]<0){
			st4[i][0]=-inf;
		} 
		else{
			st4[i][0]=a[i];
		}	
	}
	for(int i=1;i<=m;i++){
		st5[i][0]=b[i];
		st6[i][0]=b[i];
	}
	for(int j=1;(1<<j)<=n;j++){
		for(int i=1;i<=n-(1<<j-1)+1;i++){
			st1[i][j]=max(st1[i][j-1],st1[i+(1<<j-1)][j-1]);
			st2[i][j]=min(st2[i][j-1],st2[i+(1<<j-1)][j-1]);
			st3[i][j]=max(st3[i][j-1],st3[i+(1<<j-1)][j-1]);
			st4[i][j]=min(st4[i][j-1],st4[i+(1<<j-1)][j-1]);
		}
	}
	for(int j=1;(1<<j)<=m;j++){
		for(int i=1;i<=m-(1<<j-1)+1;i++){
			st5[i][j]=max(st5[i][j-1],st5[i+(1<<j-1)][j-1]);
			st6[i][j]=min(st6[i][j-1],st6[i+(1<<j-1)][j-1]);
		}
	}
}

signed main(){
	n=read();m=read();q=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
	}
	for(int i=1;i<=m;i++){
		b[i]=read();
	}
	st_create();
	for(int i=1;i<=q;i++){
		int l1,r1,l2,r2;
		int k1,k2;
		l1=read();r1=read();l2=read();r2=read();
		k1=log2(r1-l1+1);
		k2=log2(r2-l2+1);
		int x1,x2,x3,x4,x5,x6;
		x1=max(st1[l1][k1],st1[r1-(1<<k1)+1][k1]);
		x2=min(st2[l1][k1],st2[r1-(1<<k1)+1][k1]);
		x3=max(st3[l1][k1],st3[r1-(1<<k1)+1][k1]);
		x4=min(st4[l1][k1],st4[r1-(1<<k1)+1][k1]);
		x5=max(st5[l2][k2],st5[r2-(1<<k2)+1][k2]);
		x6=min(st6[l2][k2],st6[r2-(1<<k2)+1][k2]);
		int ans1=-inf,ans2=-inf,ans3=-inf,ans4=-inf;
		if(x1>=0)
			ans1=x1*x6;
		if(x2<inf)
			ans2=x2*x6;
		if(x3>-inf)
			ans3=x3*x5;
		if(x4<0)
			ans4=x4*x5;
		cout<<max(ans1,max(ans2,max(ans3,ans4)))<<'\n';
		
	}
	
	return 0;
}
2024/3/19 20:25
加载中...