求助,为什么这样写只能65
查看原帖
求助,为什么这样写只能65
500031
FJ_OIer楼主2024/7/9 22:30

细分了九种情况:

#include <bits/stdc++.h>
#define int long long
#define N 100001
using namespace std;
int n,m,q,l,r,l2,r2;
int a[N],b[N];
int sta[N][31],stb[N][31],sta_[N][31],stb_[N][31];
int _sta[N][31],_sta_[N][31];
int Maxa(int l,int r){
	int lg=log2(r-l+1);
	return max(sta[l][lg],sta[r-(1<<lg)+1][lg]);
}
int Mina(int l,int r){
	int lg=log2(r-l+1);
	return min(sta_[l][lg],sta_[r-(1<<lg)+1][lg]);
}
int Maxb(int l,int r){
	int lg=log2(r-l+1);
	return max(stb[l][lg],stb[r-(1<<lg)+1][lg]);
}
int Minb(int l,int r){
	int lg=log2(r-l+1);
	return min(stb_[l][lg],stb_[r-(1<<lg)+1][lg]);
}
int mina(int l,int r){
	int lg=log2(r-l+1);
	return min(_sta[l][lg],_sta[r-(1<<lg)+1][lg]);
}
int maxa(int l,int r){
	int lg=log2(r-l+1);
	return max(_sta_[l][lg],_sta_[r-(1<<lg)+1][lg]);
}
signed main(){
	cin>>n>>m>>q;
	for (int i=1;i<=n;i++){
		cin>>a[i];
		sta[i][0]=sta_[i][0]=a[i];
		_sta[i][0]=(a[i]>=0?a[i]:LONG_LONG_MAX);
		_sta_[i][0]=(a[i]<0?a[i]:LONG_LONG_MIN);
	}
	for (int i=1;i<=m;i++){
		cin>>b[i];
		stb[i][0]=stb_[i][0]=b[i];
	}
	int lg=log2(n);
	for (int j=1;j<=lg;j++){
		for (int i=1;i+(1<<j)-1<=n;i++){
			sta[i][j]=max(sta[i][j-1],sta[i+(1<<(j-1))][j-1]);
			sta_[i][j]=min(sta_[i][j-1],sta_[i+(1<<(j-1))][j-1]);
			_sta[i][j]=min(_sta[i][j-1],_sta[i+(1<<(j-1))][j-1]);
			_sta_[i][j]=max(_sta_[i][j-1],_sta_[i+(1<<(j-1))][j-1]);
		}
	}
	lg=log2(m);
	for (int j=1;j<=lg;j++){
		for (int i=1;i+(1<<j)-1<=m;i++){
			stb[i][j]=max(stb[i][j-1],stb[i+(1<<(j-1))][j-1]);
			stb_[i][j]=min(stb_[i][j-1],stb_[i+(1<<(j-1))][j-1]);
		}
	}
	while (q--){
		cin>>l>>r>>l2>>r2;
		int mxa=Maxa(l,r);
		int mna=Mina(l,r);
		int mxb=Maxb(l2,r2);
		int mnb=Minb(l2,r2);
		int amna=mina(l,r);
		int amxa=maxa(l,r);
		if (mna>=0&&mnb>=0){//A B 全正 
			cout<<mxa*mnb<<endl;
		}else if (mxa<0&&mnb<0){//A B 全负 
			cout<<mna*mxb<<endl;
		}else if (mna>=0&&mxb>=0&&mnb<0){//A 全正 B 正负 
			cout<<mna*mnb<<endl;
		}else if (mxa<0&&mxb>=0&&mnb<0){//A 全负 B 正负 
			cout<<mxa*mxb<<endl;
		}else if (mxa>=0&&mna<0&&mnb>=0){//A 正负 B 全正 
			cout<<mxa*mnb<<endl;
		}else if (mxa>=0&&mna<0&&mxb<0){//A 正负 B 全负 
			cout<<mna*mxb<<endl;
		}else if (mna>=0&&mxb<0){//A 全正 B 全负 
			cout<<mna*mnb<<endl;
		}else if (mxa<0&&mnb>=0){//A 全负 B 全正 
			cout<<mxa*mxb<<endl;
		}else{//A 正负 B 正负 
			cout<<max(mina(l,r)*mnb,maxa(l,r)*mxb)<<endl;
		}
	}
	return 0;
}

是不是哪里写炸了

2024/7/9 22:30
加载中...