95分代码求调,悬赏一个关注
查看原帖
95分代码求调,悬赏一个关注
339897
SLTLS99楼主2022/11/6 17:09
#include<cstdio> 
#include<cmath>
#include<algorithm>
#include<iostream>
using namespace std;
long long INF=9000000005;
long long st1[100011][40];//a最小 
long long st2[100011][40];//a最大 
long long st3[100011][40];//a正数最小 
long long st4[100011][40];//a负数最大 
long long st5[100011][40];//b最小 
long long st6[100011][40];//b最大 
long long st7[100011][40];//b正数最小 
long long st8[100011][40];//b负数最大 
long long n,m,q,l1,l2,r1,r2;
long long a[100050],b[100050];
int main()
{
    scanf("%lld%lld%lld",&n,&m,&q);
    
    for(int i=1;i<=n;i++){
    	scanf("%lld",&a[i]);
	}
	
	for(int i=1;i<=m;i++){
		scanf("%lld",&b[i]);
	}
	
	long long LCA1=(long long)(log(n)/log(2));
    long long LCA2=(long long)(log(m)/log(2));
	for(int j=0;j<=LCA1;j++){
		for(int i=1;i<=n-(1<<j)+1;i++){
			st1[i][j]=st3[i][j]=st5[i][j]=st7[i][j]=INF;
	        st2[i][j]=st4[i][j]=st6[i][j]=st8[i][j]=0-INF;
			if(j==0){
				st1[i][j]=a[i];
				st2[i][j]=a[i];		
				if(a[i]>=0){
					st3[i][j]=a[i];
				}
				if(a[i]<=0){
					st4[i][j]=a[i];
				}
			}else{
				st1[i][j]=min(st1[i][j-1],st1[i+(1<<(j-1))][j-1]);
				st2[i][j]=max(st2[i][j-1],st2[i+(1<<(j-1))][j-1]);
				st3[i][j]=min(st3[i][j-1],st3[i+(1<<(j-1))][j-1]);
				st4[i][j]=max(st4[i][j-1],st4[i+(1<<(j-1))][j-1]);
			}
		}
	}
	for(int j=0;j<=LCA2;j++){
		for(int i=1;i<=m-(1<<j)+1;i++){
			if(j==0){
				st5[i][j]=b[i];
				st6[i][j]=b[i];
				if(b[i]>=0){
					st7[i][j]=b[i];
				}
				if(b[i]<=0){
					st8[i][j]=b[i];
				}
			}else{
				st5[i][j]=min(st5[i][j-1],st5[i+(1<<(j-1))][j-1]);
				st6[i][j]=max(st6[i][j-1],st6[i+(1<<(j-1))][j-1]);
				st7[i][j]=min(st7[i][j-1],st7[i+(1<<(j-1))][j-1]);
				st8[i][j]=max(st8[i][j-1],st8[i+(1<<(j-1))][j-1]);
			} 
		}
	}
	long long s1,s2,s3,s4,s5,s6,s7,s8;
	for(int i=1;i<=q;i++){
		scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
		long long k2=(long long)(log(r2-l2+1)/log(2));
		long long k1=(long long)(log(r1-l1+1)/log(2));
		s1=min(st1[l1][k1],st1[r1-(1<<k1)+1][k1]);//a最小 
		s2=max(st2[l1][k1],st2[r1-(1<<k1)+1][k1]);//a最大 
		s3=min(st3[l1][k1],st3[r1-(1<<k1)+1][k1]);//a正数最小 
		s4=max(st4[l1][k1],st4[r1-(1<<k1)+1][k1]);//a负数最大 
		s5=min(st5[l2][k2],st5[r2-(1<<k2)+1][k2]);//b最小 
		s6=max(st6[l2][k2],st6[r2-(1<<k2)+1][k2]);//b最大 
		s7=min(st7[l2][k2],st7[r2-(1<<k2)+1][k2]);//b正数最小 
		s8=max(st8[l2][k2],st8[r2-(1<<k2)+1][k2]);//b负数最大 
	//	cout<<s1<<" "<<s2<<" "<<s3<<" "<<s4<<" "<<s5<<" "<<s6<<" "<<s7<<" "<<s8<<endl;
		if(s5<=0&&s6>=0){
			cout<<max(s3*s5,s4*s6)<<endl;
		}else if(s5<=0&&s6<=0){
			if(s1<=0){
				cout<<s1*s8<<endl;
			}else{
				cout<<s3*s5<<endl;
			}
		}else if(s5>=0&&s6>=0){
			if(s2>=0){
				cout<<s2*s7<<endl;
			}else{
				cout<<s4*s6<<endl;
			}
		}
	}
    return 0;
}
2022/11/6 17:09
加载中...