不分类讨论枚举求调
查看原帖
不分类讨论枚举求调
490694
Compound_Interest楼主2022/11/13 12:58

0pts,样例全过。

#include<cstdio>
#include<algorithm>
#include<cmath>
#define int long long
using namespace std;
const int maxn=1e5+10;
int a[maxn],b[maxn],n,q,m,sa0[maxn],sb0[maxn],mnLz[20][maxn],mxLf[20][maxn],mxL[20][maxn],mnL[20][maxn],mxQ[20][maxn],mnQ[20][maxn];
int ck0(int l,int r,int op){
	if(op==1) return (sa0[r]-sa0[l-1])>0;
	return (sb0[r]-sb0[l-1])>0;
}
int quemx(int l,int r,int op){
	int k=log(r-l+1)/log(2);
	if(op==1) return max(mxL[k][l],mxL[k][r-(1<<k)+1]);
	else return max(mxQ[k][l],mxQ[k][r-(1<<k)+1]);
}
int quemn(int l,int r,int op){
	int k=log(r-l+1)/log(2);
	if(op==1) return min(mnL[k][l],mnL[k][r-(1<<k)+1]);
	else return min(mnQ[k][l],mnQ[k][r-(1<<k)+1]);
}
int quemnLz(int l,int r){
	int k=log(r-l+1)/log(2);
	return min(mnLz[k][l],mnLz[k][r-(1<<k)+1]);	
}
int quemxLf(int l,int r){
	int k=log(r-l+1)/log(2);
	return max(mxLf[k][l],mxLf[k][r-(1<<k)+1]);
}
signed main(){
	scanf("%lld%lld%lld",&n,&m,&q);
	for(int i=1ll;i<=n;i++){
		scanf("%lld",&a[i]);
		if(!a[i]) sa0[i]=sa0[i-1]+1;
		else sa0[i]=sa0[i-1];
		mxL[0][i]=mnL[0][i]=a[i];
		mnLz[0][i]=(a[i]<=0)?1e15:a[i];
		mxLf[0][i]=(a[i]>=0)?-1e15:a[i];
	}
	for(int i=1;i<=m;i++){
		scanf("%lld",&b[i]);
		if(!b[i]) sb0[i]=sb0[i-1]+1;
		else sb0[i]=sb0[i-1];
		mxQ[0][i]=mnQ[0][i]=b[i];
	}
	for(int i=1;i<=19;i++)
		for(int j=1;j<=n;j++){
			if(j+(1<<(i-1))>100000) continue;
			mxL[i][j]=max(mxL[i-1][j],mxL[i-1][j+(1<<(i-1))]);
			mnL[i][j]=min(mnL[i-1][j],mnL[i-1][j+(1<<(i-1))]);
			mnLz[i][j]=min(mnLz[i-1][j],mnLz[i-1][j+(1<<(i-1))]);
			mxLf[i][j]=max(mxLf[i-1][j],mxLf[i-1][j+(1<<(i-1))]);
		}
	for(int i=1;i<=19;i++)
		for(int j=1;j<=m;j++){
			if(j+(1<<(i-1))>100000) continue;
			mxQ[i][j]=max(mxQ[i-1][j],mxQ[i-1][j+(1<<(i-1))]);
			mnQ[i][j]=min(mnQ[i-1][j],mnQ[i-1][j+(1<<(i-1))]);			
		}	
	while(q--){
		int l1,r1,l2,r2;
		scanf("%lld%lld%lld%lld",&l1,&r1,&l2,&r2);
		int xL=quemx(l1,r1,1),nL=quemn(l1,r1,1),xQ=quemx(l2,r2,2),nQ=quemn(l2,r2,2),nLz=quemnLz(l1,r1),xLf=quemxLf(l1,r1),ans=-1e15;
		for(int i=1;i<=5;i++){
			int x=0,y=0;
			if(i==1) x=xL;
			if(i==2) x=nL;
			if(i==3&&!ck0(l1,r1,1)) continue;
			if(i==3&&ck0(l1,r1,1)) x=0;
			if(i==4&&nLz==(int)1e15) continue;
			if(i==4&&nLz!=(int)1e15) x=nLz;
			if(i==5&&xLf==(int)-1e15) continue;
			if(i==5&&xLf!=(int)-1e15) x=xLf;
			int tmp=1e15;
			for(int j=1;j<=3;j++){
				if(j==1) y=xQ;
				if(j==2) y=nQ;
				if(j==3&&ck0(l2,r2,2)) y=0;
				if(j==3&&!ck0(l2,r2,2)) continue;
				tmp=min(tmp,x*y);
			}
			ans=max(ans,tmp);
		}
		printf("%lld\n",ans);
	}
	return 0;
} 
2022/11/13 12:58
加载中...