wa2-4,8,19
查看原帖
wa2-4,8,19
1129446
nksunhaolan楼主2024/10/17 18:27
#include <bits/stdc++.h>
#define ll long long
using namespace std;

const ll N=1e5+5,inf=0x3f3f3f3f3f3f3f3f;
ll n,m,q,k,a,b,_inf;

ll sta0_min[N][20],sta0_max[N][20],sta1_min[N][20],sta1_max[N][20];
ll stb0_min[N][20],stb0_max[N][20],stb1_min[N][20],stb1_max[N][20];
bool sta[N][20],stb[N][20];

ll loog[N];

void init(){
	loog[0]=-1;for(ll i=1;i<=n;i++)loog[i]=loog[i>>1]+1;
	memset(sta0_min,0x3f,sizeof(sta0_min));memset(sta1_min,0x3f,sizeof(sta1_min));
	memset(sta0_max,-0x3f,sizeof(sta0_max));memset(sta1_max,-0x3f,sizeof(sta1_max));
	memset(stb0_min,0x3f,sizeof(stb0_min));memset(stb1_min,0x3f,sizeof(stb1_min));
	memset(stb0_max,-0x3f,sizeof(stb0_max));memset(stb1_max,-0x3f,sizeof(stb1_max));
	
	
}
void dp(){
	k=loog[n];
	for(ll j=1;j<=k;j++){
		ll i=1;
		for(;i<=n-(1<<j)+1;i++){
			sta0_min[i][j]=min(sta0_min[i][j-1],sta0_min[i+(1<<j-1)][j-1]);
			sta1_min[i][j]=min(sta1_min[i][j-1],sta1_min[i+(1<<j-1)][j-1]);
			sta0_max[i][j]=max(sta0_max[i][j-1],sta0_max[i+(1<<j-1)][j-1]);
			sta1_max[i][j]=max(sta1_max[i][j-1],sta1_max[i+(1<<j-1)][j-1]);
			sta[i][j]=sta[i][j-1]|sta[i+(1<<j-1)][j-1];
		}
		for(;i<=n;i++){
			sta0_min[i][j]=sta0_min[i][j-1];
			sta1_min[i][j]=sta1_min[i][j-1];
			sta0_max[i][j]=sta0_max[i][j-1];
			sta1_max[i][j]=sta1_max[i][j-1];
			sta[i][j]=sta[i][j-1];
		}
	}
	k=loog[m];
	for(ll j=1;j<=k;j++){
		ll i=1;
		for(;i<=m-(1<<j)+1;i++){
			stb0_min[i][j]=min(stb0_min[i][j-1],stb0_min[i+(1<<j-1)][j-1]);
			stb1_min[i][j]=min(stb1_min[i][j-1],stb1_min[i+(1<<j-1)][j-1]);
			stb0_max[i][j]=max(stb0_max[i][j-1],stb0_max[i+(1<<j-1)][j-1]);
			stb1_max[i][j]=max(stb1_max[i][j-1],stb1_max[i+(1<<j-1)][j-1]);
			stb[i][j]=stb[i][j-1]|stb[i+(1<<j-1)][j-1];
		}
		for(;i<=n;i++){
			stb0_min[i][j]=stb0_min[i][j-1];
			stb1_min[i][j]=stb1_min[i][j-1];
			stb0_max[i][j]=stb0_max[i][j-1];
			stb1_max[i][j]=stb1_max[i][j-1];
			stb[i][j]=stb[i][j-1];
		}
	}
}

ll get_ans(const ll& l,const ll& r,const bool& x /*a or b*/ ,const bool& y /*min or max*/ ,const bool& z /*0 or 1*/ ){
	k=loog[r-l+1];
	if(x){//a
		if(y){//min
			if(z){//0
				return min(sta0_min[l][k],sta0_min[r-(1<<k)+1][k]);
			}else{//1
				return min(sta1_min[l][k],sta1_min[r-(1<<k)+1][k]);
			}
		}else{//max
			if(z){//0
				return max(sta0_max[l][k],sta0_max[r-(1<<k)+1][k]);
			}else{//1
				return max(sta1_max[l][k],sta1_max[r-(1<<k)+1][k]);
			}
		}
	}else{//b
		if(y){//min
			if(z){//0
				return min(stb0_min[l][k],stb0_min[r-(1<<k)+1][k]);
			}else{//1
				return min(stb1_min[l][k],stb1_min[r-(1<<k)+1][k]);
			}
		}else{//max
			if(z){//0
				return max(stb0_max[l][k],stb0_max[r-(1<<k)+1][k]);
			}else{//1
				return max(stb1_max[l][k],stb1_max[r-(1<<k)+1][k]);
			}
		}
	}
}

bool get(const ll& l,const ll& r,const bool& x /*a or b*/ ){
	k=loog[r-l+1];
	if(x){//a
		return sta[l][k]|sta[r-(1<<k)+1][k];
	}else{//b
		return stb[l][k]|stb[r-(1<<k)+1][k];
	}
}

int main(){
	freopen("P8818_4.in","r",stdin);
	freopen("hhh","w",stdout);
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	
	cin>>n>>m>>q;init();
	_inf=sta0_max[0][0];
	for(ll i=1;i<=n;i++){
		cin>>a;
		if(a==0){
			sta[i][0]=1;
		}else if(a<0){
			sta0_min[i][0]=sta0_max[i][0]=a;
		}else if(a>0){
			sta1_min[i][0]=sta1_max[i][0]=a;
		}
	}
	for(ll i=1;i<=m;i++){
		cin>>b;
		if(b==0){
			stb[i][0]=1;
		}else if(b<0){
			stb0_min[i][0]=stb0_max[i][0]=b;
		}else if(b>0){
			stb1_min[i][0]=stb1_max[i][0]=b;
		}
	}
	dp();
	ll l1,r1,l2,r2;
	ll ans_sta0_min,ans_sta0_max,ans_sta1_min,ans_sta1_max;
	ll ans_stb0_min,ans_stb0_max,ans_stb1_min,ans_stb1_max;
	bool ans_sta,ans_stb;
	bool a0,a1,b0,b1;
	ll ans;
	for(ll i=1;i<=q;i++){
		cin>>l1>>r1>>l2>>r2;
		ans_sta0_min=get_ans(l1,r1,1,1,1);ans_sta0_max=get_ans(l1,r1,1,0,1);
		ans_sta1_min=get_ans(l1,r1,1,1,0);ans_sta1_max=get_ans(l1,r1,1,0,0);
		ans_stb0_min=get_ans(l2,r2,0,1,1);ans_stb0_max=get_ans(l2,r2,0,0,1);
		ans_stb1_min=get_ans(l2,r2,0,1,0);ans_stb1_max=get_ans(l2,r2,0,0,0);
		ans_sta=get(l1,r1,1); ans_stb=get(l2,r2,0);
		a0=(ans_sta0_min!=inf||ans_sta0_max!=_inf);
		a1=(ans_sta1_min!=inf||ans_sta1_max!=_inf);
		b0=(ans_stb0_min!=inf||ans_stb0_max!=_inf);
		b1=(ans_stb1_min!=inf||ans_stb1_max!=_inf);
//		cout<<ans_sta0_min<<" "<<ans_sta0_max<<" "<<ans_sta1_min<<" "<<ans_sta1_max<<'\n';
//		cout<<ans_stb0_min<<" "<<ans_stb0_max<<" "<<ans_stb1_min<<" "<<ans_stb1_max<<'\n';
//		cout<<inf<<" "<<-inf<<'\n';
		if((!a0 && ans_sta && !a1) || (!b0 && ans_stb && !b1)){
			ans=0;
		} else if(b0 && !b1){
			if(a0){
				ans=ans_sta0_min*ans_stb0_max;
				if(ans_stb)ans=0;
			} else {
				if(ans_sta){
					ans=0;
				} else {
					ans=ans_sta1_min*ans_stb0_min;
				}
			}
		} else if(!b0 && b1){
			if(a1){
				ans=ans_sta1_max*ans_stb1_min;
				if(ans_stb)ans=0;
			} else {
				if(ans_sta){
					ans=0;
				} else {
					ans=ans_sta0_max*ans_stb1_max;
				}
			}
		} else {
			if(a0 && a1){
				ans=max(ans_sta1_min*ans_stb0_min,ans_sta0_max*ans_stb1_max);
			} else {
				if(a1){
					ans=ans_sta1_min*ans_stb0_min;
				} else {
					ans=ans_sta0_max*ans_stb1_max;
				}
			}
			if(ans_sta){
				ans=max(ans,0ll);
			}
		}
		cout<<ans<<'\n';
	}
}

2024/10/17 18:27
加载中...