ST表T了求调悬3关思路与题解相差无几
查看原帖
ST表T了求调悬3关思路与题解相差无几
1422661
_APIO_楼主2024/8/29 15:48
#include<bits/stdc++.h>
using namespace std;
const int N=1e5;
int n,m,q;
int st1mn[N][18];
int st1mx[N][18];
int st2mn[N][18];
int st2mx[N][18];
int st3mn[N][18];
int st3mx[N][18]; 
int a[N],b[N];
int INF=1e9+7;
void Init(){
	int logn=log2(n);
	int logm=log2(m);
	for(int j=0;j<=logn;j++){
		for(int i=1;i+(1<<j)-1<=n;i++){
			if(j==0){
				st1mn[i][j]=a[i];
				st1mx[i][j]=a[i];
				st3mn[i][j]=INF;
				st3mx[i][j]=-INF;
				if(a[i]>0){
					st3mn[i][j]=a[i];
				}
				else if(a[i]<0){
					st3mx[i][j]=a[i];
				}
				else{
					st3mn[i][j]=a[i];
					st3mx[i][j]=a[i];
				}
				continue;	
			}
			st1mn[i][j]=min(st1mn[i][j-1],st1mn[i+(1<<(j-1))][j-1]);
			st1mx[i][j]=max(st1mx[i][j-1],st1mx[i+(1<<(j-1))][j-1]);
			st3mn[i][j]=min(st3mn[i][j-1],st3mn[i+(1<<(j-1))][j-1]);
			st3mx[i][j]=max(st3mx[i][j-1],st3mx[i+(1<<(j-1))][j-1]);
			//printf("st3mx[%d][%d]=%d,",i,j,st3mx[i][j]);		
		}
		//cout<<endl;
	}
	for(int j=0;(1<<j)<=logm;j++){
		for(int i=1;i+(1<<j)-1<=m;i++){
			if(j==0){
				st2mn[i][j]=b[i];
				st2mx[i][j]=b[i];
				continue;	
			}
			st2mn[i][j]=min(st2mn[i][j-1],st2mn[i+(1<<(j-1))][j-1]);
			st2mx[i][j]=max(st2mx[i][j-1],st2mx[i+(1<<(j-1))][j-1]);	
		}
	}
	return;
}
int find_mn1(int l,int r){
	int k=log2(r-l+1);
	int ans=min(st1mn[l][k],st1mn[r-(1<<k)+1][k]);
	return ans;
}
int find_mn2(int l,int r){
	int k=log2(r-l+1);
	int ans=min(st2mn[l][k],st2mn[r-(1<<k)+1][k]);
	return ans;
}
int find_mn3(int l,int r){
	int k=log2(r-l+1);
	int ans=min(st3mn[l][k],st3mn[r-(1<<k)+1][k]);
	return ans;
}
int find_mx1(int l,int r){
	int k=log2(r-l+1);
	int ans=max(st1mx[l][k],st1mx[r-(1<<k)+1][k]);
	return ans;
}
int find_mx2(int l,int r){
	int k=log2(r-l+1);
	int ans=max(st2mx[l][k],st2mx[r-(1<<k)+1][k]);
	return ans;
}
int find_mx3(int l,int r){
	int k=log2(r-l+1);
	int ans=max(st3mx[l][k],st3mx[r-(1<<k)+1][k]);
	return ans;
}
int main(){
	//freopen("game4.in","r",stdin);
	//freopen("gamex.ans","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%d",&b[i]);
	}
	Init();
	while(q--){
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		int mn1=find_mn1(l1,r1);
		int mx1=find_mx1(l1,r1);
		int mn2=find_mn2(l2,r2);
		int mx2=find_mx2(l2,r2);
		int mn3=find_mn3(l1,r1);
		int mx3=find_mx3(l1,r1);
		long long ans=0;
		if(mn1>=0){//全为正数 
			if(mn2>=0){
				ans=1ll*mx1*mn2;
			}
			else{
				ans=1ll*mn3*mn2;
			}
		}
		else if(mn1<=0 && mx1>=0){//有正有负 
			if(mn2>=0){
				ans=1ll*mx1*mn2;
			}
			else if(mn2<=0 && mx2>=0){
				ans=max(1ll*mx3*mx2,1ll*mn3*mn2);
			}
			else{
				ans=1ll*mn1*mx2;
			} 
		}
		else{//全为负数 
			if(mx2>=0){
				ans=1ll*mx3*mx2;
			}
			else{
				ans=1ll*mn1*mx2;
			}
		}
		printf("%lld\n",ans); 
    }
    return 0;
}
//-2 -1 1 2 3
//-3 -1 1 2
2024/8/29 15:48
加载中...