80分求助!
查看原帖
80分求助!
649262
zyxxxxxxxxxx楼主2023/8/15 10:46
#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,q;
int a1[110000],b[110000];
int f[110000][50][10];
//正大正小负大负小 
void ST_create(int a[],int fla,int n1){
    for(int i=1; i<=n1; i++) {// 初始化
    	if(fla%4==1){
    		if(a[i]<0){
    			f[i][0][fla]=-1e9-1; 
			}else{
				f[i][0][fla] = a[i]; 
			}
		}else if(fla%4==2){
    		if(a[i]<0){
    			f[i][0][fla]=1e9+1; 
			}else{
				f[i][0][fla] = a[i]; 
			}
		}else if(fla%4==3){
    		if(a[i]>=0){
    			f[i][0][fla]=-1e9-1; 
			}else{
				f[i][0][fla] = a[i]; 
			}
		}else if(fla%4==0){
    		if(a[i]>=0){
    			f[i][0][fla]=1e9+1; 
			}else{
				f[i][0][fla] = a[i]; 
			}
		}
        
        
	}
    int k=log2(n1); 
    for(int j=1; (1<<j)<=n1; j++){
    //i+2^j-1<=n ---> (1<<j)<=n ---> 2^j<=n ---> j<=log2(n)
        for(int i=1; i<=n1-(1<<j)+1; i++){ // i+2^j-1<=n --> i<=n-2^j+1
        	if(fla%2==1){
        		f[i][j][fla] = max(f[i][j-1][fla], f[i+(1<<(j-1))][j-1][fla]);
			}else{
				f[i][j][fla]=  min(f[i][j-1][fla], f[i+(1<<(j-1))][j-1][fla]);
			} 
            
        }
    }
    
}
//求区间[l,r]的最值,每次查询时间复杂度O(1)
int ST_query(int l, int r,int fla){
    int s=log2(r-l+1);
    if(fla%2==1){
    	return max(f[l][s][fla], f[r-(1<<s)+1][s][fla]);
	}else{
		return min(f[l][s][fla], f[r-(1<<s)+1][s][fla]);
	}
    
	// 取两个区间最值f[l][s]:l往后数2^s个 ? ?
    // f[r-(1<<s)+1][s]:r往前数2^s个
}
signed main() {
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		scanf("%lld",&a1[i]);
	}
	for(int i=1;i<=m;i++){
		scanf("%lld",&b[i]);
	}
	for(int i=1;i<=8;i++){
		if(i<=4){
			ST_create(a1,i,n);
		}else{
			ST_create(b,i,m);
		}
	}
	for(int i=1;i<=q;i++){
		int l1,l2,r1,r2;
		scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
		int kkk[10];
		for(int i=1;i<=8;i++){
			if(i<=4){
				kkk[i]=ST_query(l1,r1,i);
			}else{
				kkk[i]=ST_query(l2,r2,i);
			}
		//	cout<<"k:"<<kkk[i]<<" ";
		}
	//	cout<<endl;
		int maxx=-1e18-1;
		if(kkk[8]==1e9+1){
			if(kkk[1]!=-1e9-1){
				maxx=max(maxx,kkk[1]*kkk[6]);
			}else{
				maxx=max(maxx,kkk[3]*kkk[5]);	
			}
		}else if(kkk[5]==-1e9-1){
			if(kkk[4]!=1e9+1){
				maxx=max(maxx,kkk[4]*kkk[7]);
			}else{
				maxx=max(maxx,kkk[2]*kkk[8]);	
			}
		}else{
			if(kkk[1]==-1e9-1){
				maxx=max(maxx,kkk[3]*kkk[5]);
			}else if(kkk[3]==1e9+1){
				maxx=max(maxx,kkk[2]*kkk[8]);
			}else{
	//			cout<<"shit"; 
				maxx=max(maxx,max(kkk[2]*kkk[8],kkk[3]*kkk[5]));
			}
		}
		
		printf("%lld\n",maxx);
	}
	
 	return 0;
 }

2023/8/15 10:46
加载中...