-S T2求
查看原帖
-S T2求
638717
Lyu_echo楼主2022/11/22 21:55

分块,样例12过,没过大样例

#include<bits/stdc++.h>
#define int long long 
using namespace std;
int n,m,q;
int block_a,num_a,block_b,num_b;
int a[100010],b[100010];
int belong_a[100010],l_a[100010],r_a[100010];
int belong_b[100010],l_b[100010],r_b[100010];
int mmax_a[100010],mmin_a[100010];
int fmmax_a[100010],fmmin_a[100010];
int mmax_b[100010],mmin_b[100010];
void build_a(){	
	block_a=sqrt(n);
	num_a=n/block_a;
	if(n%block_a) num_a++;
	for(int i=1;i<=n;i++) belong_a[i]=(i-1)/block_a+1;
	for(int i=1;i<=num_a;i++){
		l_a[i]=block_a*(i-1)+1;
		r_a[i]=block_a*i;
	}
	r_a[num_a]=n;
	for(int i=1;i<=num_a;i++) for(int j=l_a[i];j<=r_a[i];j++) mmax_a[i]=max(mmax_a[i],a[j]);
	for(int i=1;i<=num_a;i++) for(int j=l_a[i];j<=r_a[i];j++) mmin_a[i]=min(mmin_a[i],a[j]);
	for(int i=1;i<=num_a;i++) for(int j=l_a[i];j<=r_a[i];j++) if(a[j]<0) fmmax_a[i]=max(fmmax_a[i],a[j]);
	for(int i=1;i<=num_a;i++) for(int j=l_a[i];j<=r_a[i];j++) if(a[j]>=0) fmmin_a[i]=min(fmmin_a[i],a[j]);
}
void build_b(){
	block_b=sqrt(m);
	num_b=m/block_b;
	if(m%block_b) num_b++;
	for(int i=1;i<=m;i++) belong_b[i]=(i-1)/block_b+1;
	for(int i=1;i<=num_b;i++){
		l_b[i]=block_b*(i-1)+1;
		r_b[i]=block_b*i;
	}
	r_b[num_b]=m;
	for(int i=1;i<=num_b;i++) for(int j=l_b[i];j<=r_b[i];j++) mmax_b[i]=max(mmax_b[i],b[j]);
	for(int i=1;i<=num_b;i++) for(int j=l_b[i];j<=r_b[i];j++) mmin_b[i]=min(mmin_b[i],b[j]);
}
int ask_a_max(int x,int y){
	if(belong_a[x]==belong_a[y]){
		int ans=LONG_LONG_MIN;
		for(int i=x;i<=y;i++) ans=max(ans,a[i]);
		return ans; 
	}
	int ans=LONG_LONG_MIN;
	for(int i=x;i<=r_a[belong_a[x]];i++) ans=max(ans,a[i]);
	for(int i=belong_a[x]+1;i<belong_a[y];i++) ans=max(ans,mmax_a[i]);
	for(int i=l_a[belong_a[x]];i<=y;i++) ans=max(ans,a[i]);
	return ans; 
}
int ask_b_max(int x,int y){
	if(belong_b[x]==belong_b[y]){
		int ans=LONG_LONG_MIN;
		for(int i=x;i<=y;i++) ans=max(ans,b[i]);
		return ans; 
	}
	int ans=LONG_LONG_MIN;
	for(int i=x;i<=r_b[belong_b[x]];i++) ans=max(ans,b[i]);
	for(int i=belong_b[x]+1;i<belong_b[y];i++) ans=max(ans,mmax_b[i]);
	for(int i=l_b[belong_b[x]];i<=y;i++) ans=max(ans,b[i]);
	return ans; 
}
int ask_a_min(int x,int y){
	if(belong_a[x]==belong_a[y]){
		int ans=LONG_LONG_MAX;
		for(int i=x;i<=y;i++) ans=min(ans,a[i]);
		return ans; 
	}
	int ans=LONG_LONG_MAX;
	for(int i=x;i<=r_a[belong_a[x]];i++) ans=min(ans,a[i]);
	for(int i=belong_a[x]+1;i<belong_a[y];i++) ans=min(ans,mmin_a[i]);
	for(int i=l_a[belong_a[x]];i<=y;i++) ans=min(ans,a[i]);
	return ans; 
}
int ask_b_min(int x,int y){
	if(belong_b[x]==belong_b[y]){
		int ans=LONG_LONG_MAX;
		for(int i=x;i<=y;i++) ans=min(ans,b[i]);
		return ans; 
	}
	int ans=LONG_LONG_MAX;
	for(int i=x;i<=r_b[belong_b[x]];i++) ans=min(ans,b[i]);
	for(int i=belong_b[x]+1;i<belong_b[y];i++) ans=min(ans,mmin_b[i]);
	for(int i=l_b[belong_b[x]];i<=y;i++) ans=min(ans,b[i]);
	return ans; 
}
int ask_a_fmax(int x,int y){
	if(belong_a[x]==belong_a[y]){
		int ans=LONG_LONG_MIN;
		for(int i=x;i<=y;i++) if(a[i]<0) ans=max(ans,a[i]);
		return ans; 
	}
	int ans=LONG_LONG_MIN;
	for(int i=x;i<=r_a[belong_a[x]];i++) if(a[i]<0) ans=max(ans,a[i]);
	for(int i=belong_a[x]+1;i<belong_a[y];i++) ans=max(ans,fmmax_a[i]);
	for(int i=l_a[belong_a[x]];i<=y;i++) if(a[i]<0) ans=max(ans,a[i]);
	return ans; 
}
int ask_a_fmin(int x,int y){
	if(belong_a[x]==belong_a[y]){
		int ans=LONG_LONG_MAX;
		for(int i=x;i<=y;i++) if(a[i]>=0) ans=min(ans,a[i]);
		return ans; 
	}
	int ans=LONG_LONG_MAX;
	for(int i=x;i<=r_a[belong_a[x]];i++) if(a[i]>=0) ans=min(ans,a[i]);
	for(int i=belong_a[x]+1;i<belong_a[y];i++) ans=min(ans,fmmin_a[i]);
	for(int i=l_a[belong_a[x]];i<=y;i++) if(a[i]>=0) ans=min(ans,a[i]);
	return ans; 
}
signed main(){
	ios::sync_with_stdio(false);
	cin.tie(nullptr);
	cout.tie(nullptr);
	// freopen("game4.in","r",stdin);
	// freopen("game.out","w",stdout);

	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		mmin_a[i]=LONG_LONG_MAX;
		mmax_a[i]=LONG_LONG_MIN;
		mmin_b[i]=LONG_LONG_MAX;
		mmax_b[i]=LONG_LONG_MIN;
		fmmax_a[i]=LONG_LONG_MIN;
		fmmin_a[i]=LONG_LONG_MAX;
	}
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int j=1;j<=m;j++) cin>>b[j];
	build_a();
	build_b();	
	while(q--){
		int la,ra,lb,rb;
		cin>>la>>ra>>lb>>rb;
		int a_max=ask_a_max(la,ra);
		int a_min=ask_a_min(la,ra);
		int a_fmax=ask_a_fmax(la,ra);
		int a_fmin=ask_a_fmin(la,ra);
		int b_max=ask_b_max(lb,rb);
		int b_min=ask_b_min(lb,rb); 
		int ans=LONG_LONG_MIN;
		ans=max(ans,a_max*(a_max>=0 ? b_min : b_max));
		ans=max(ans,a_min*(a_min>=0 ? b_min : b_max));
		if(a_fmax!=LONG_LONG_MIN) ans=max(ans,a_fmax*(a_fmax>=0 ? b_min : b_max));
		if(a_fmin!=LONG_LONG_MAX) ans=max(ans,a_fmin*(a_fmin>=0 ? b_min : b_max));
		// cout<<a_max*(a_max>=0 ? b_min : b_max)<<" ";
		// cout<<a_min*(a_min>=0 ? b_min : b_max)<<" ";
		// if(a_fmax!=LONG_LONG_MIN) cout<<a_fmax*(a_fmax>=0 ? b_min : b_max)<<" ";
		// if(a_fmin!=LONG_LONG_MAX) cout<<a_fmin*(a_fmin>=0 ? b_min : b_max)<<endl;
		cout<<ans<<endl;
		// cout<<a_max<<" "<<a_min<<" "<<a_fmax<<" "<<a_fmin<<endl;
		// cout<<b_max<<" "<<b_min;
		// cout<<endl;
	}

	return 0;
}
2022/11/22 21:55
加载中...