60pts,后8个点TLE
查看原帖
60pts,后8个点TLE
536369
Saicy_zc32楼主2022/11/5 11:27

怎么优化啊

#include<iostream>
#include<cstdio>
using namespace std;
long long m,n,q,a[100008],b[100008],stamax[100008][55],stamin[100008][55],stbmax[100008][55],stbmin[100008][55],log[100008];
inline long long read()
{
	long long 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 main(){
	n=read();
	m=read();
	q=read();
	for(int i=1;i<=n;i++){
		a[i]=read();
		stamax[i][0]=a[i];
		stamin[i][0]=a[i];
	}
	for(int i=1;i<=m;i++){
		b[i]=read();
		stbmax[i][0]=b[i];
		stbmin[i][0]=b[i];
	}
	log[1]=0;log[2]=1;
	for(register int i=3;i<=max(n,m);i++){
		log[i]=log[(i>>1)]+1;
	}
	for(register int j=1;j<=log[n];j++){
		for(register int i=1;i<=n-(1<<j)+1;i++){
			stamax[i][j]=max(stamax[i][j-1],stamax[i+(1<<(j-1))][j-1]);
			stamin[i][j]=min(stamin[i][j-1],stamin[i+(1<<(j-1))][j-1]);
		}
	}
	for(register int j=1;j<=log[m];j++){
		for(register int i=1;i<=m-(1<<j)+1;i++){
			stbmax[i][j]=max(stbmax[i][j-1],stbmax[i+(1<<(j-1))][j-1]);
			stbmin[i][j]=min(stbmin[i][j-1],stbmin[i+(1<<(j-1))][j-1]);
		}
	}
	long long l1,l2,r1,r2;
	while(q--){
		long long cmp1,cmp2;
		long long azhenmin=999999999;long long afumax=-999999999;
		l1=read();r1=read();l2=read();r2=read();
		for(int i=l1;i<=r1;i++){
			if(a[i]>afumax&&a[i]<0){
				afumax=a[i];
			}
			if(a[i]<azhenmin&&a[i]>=0){
				azhenmin=a[i];
			}			
		}
		
		long long int kl=log[r2-l2+1];
		long long int bmax=max(stbmax[l2][kl],stbmax[r2-(1<<kl)+1][kl]);
		long long int bmin=min(stbmin[l2][kl],stbmin[r2-(1<<kl)+1][kl]);
		kl=log[r1-l1+1];
		long long int amax=max(stamax[l1][kl],stamax[r1-(1<<kl)+1][kl]);
		long long int amin=min(stamin[l1][kl],stamin[r1-(1<<kl)+1][kl]);
		if(bmin>=0){
			cmp1=bmin*amax;
		}
		if(bmin<0){
			cmp1=azhenmin*bmin;
		}
		if(bmax>=0){
			cmp2=afumax*bmax;			
		}
		if(bmax<0){
			cmp2=amin*bmax;
		}
		int l;
		if(amin>=0){
			cout<<cmp1<<endl;
		}
		else if(amax<0){
			cout<<cmp2<<endl;
		}
		else{
			cout<<max(cmp1,cmp2)<<endl;
		}
	}
	return 0;
}
2022/11/5 11:27
加载中...