分块,40pts,求hack
查看原帖
分块,40pts,求hack
1353330
K_J_M楼主2024/7/22 16:23
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N  = 1e5+10;
const int M  = sqrt(1e6+10);
int q,n,m,l1,l2,r1,r2,len1,len2,num1,num2,belong[N][2],a[N][2];
struct node{
	int l,r,minz,maxz,minf,maxf,havef,havez,havezero;
}b[M][2];//b[i][0]表示n,b[i][1]表示m 
void build(){
	len1=sqrt(n);len2=sqrt(m);
	num1=sqrt(n);num2=sqrt(m);
	for(int i=1;i<=num1;i++) b[i][0].l=(i-1)*len1+1,b[i][0].r=i*len1;
	for(int i=1;i<=num2;i++) b[i][1].l=(i-1)*len2+1,b[i][1].r=i*len2;
	if(len1*num1<n){
		num1++;
		b[num1][0].l=b[num1-1][0].r+1;
		b[num1][0].r=n;
	}
	if(len2*num2<m){
		num2++;
		b[num2][1].l=b[num2-1][1].r+1;
		b[num2][1].r=m;
	}
	for(int i=1;i<=num1;i++){
		b[i][0].maxf=-0x3fffffffffffffff;
		b[i][0].minz=0x3fffffffffffffff;
		for(int j=b[i][0].l;j<=b[i][0].r;j++){
			if(a[j][0]<0){
				b[i][0].minf=min(b[i][0].minf,a[j][0]);//最小负数 
				b[i][0].maxf=max(b[i][0].maxf,a[j][0]);//最大负数 
				b[i][0].havef=1;
			}
			if(a[j][0]>0){
				b[i][0].minz=min(b[i][0].minz,a[j][0]);//最小正数 
				b[i][0].maxz=max(b[i][0].maxz,a[j][0]);//最大正数 
				b[i][0].havez=1;
			}
			if(a[j][0]==0){
				b[i][0].havezero=1;
			}
			belong[j][0]=i;
		}
	}
	for(int i=1;i<=num2;i++){
		b[i][1].maxf=-0x3fffffffffffffff;
		b[i][1].minz=0x3fffffffffffffff;
		for(int j=b[i][1].l;j<=b[i][1].r;j++){
			if(a[j][1]<0){
				b[i][1].minf=min(b[i][1].minf,a[j][1]);//最小负数 
				b[i][1].maxf=max(b[i][1].maxf,a[j][1]);//最大负数 
				b[i][1].havef=1;
			}
			if(a[j][1]>0){
				b[i][1].minz=min(b[i][1].minz,a[j][1]);//最小正数 
				b[i][1].maxz=max(b[i][1].maxz,a[j][1]);//最大正数 
				b[i][1].havez=1;
			}
			if(a[j][1]==0){
				b[i][1].havezero=1;
			}
			belong[j][1]=i;
		}
	}
}
int gethavezero(int x,int y,int id){
	int p=belong[x][id],q=belong[y][id];
	for(int i=p+1;i<q;i++){
		if(b[i][id].havezero) return 1; 
	}
	for(int i=x;i<=b[p][id].r;i++){
		if(a[i][id]==0)  return 1;
	}
	for(int i=b[q][id].l;i<=y;i++){
		if(a[i][id]==0)  return 1;
	}
	return 0;
}
int gethavef(int x,int y,int id){
	int p=belong[x][id],q=belong[y][id];
	for(int i=p+1;i<q;i++){
		if(b[i][id].havef) return 1;
	}
	for(int i=x;i<=b[p][id].r;i++){
		if(a[i][id]<0)  return 1;
	}
	for(int i=b[q][id].l;i<=y;i++){
		if(a[i][id]<0)  return 1;
	}
	return 0;
}
int gethavez(int x,int y,int id){
	int p=belong[x][id],q=belong[y][id];
	for(int i=p+1;i<q;i++){
		if(b[i][id].havez) return 1;
	}
	for(int i=x;i<=b[p][id].r;i++){
		if(a[i][id]>0)  return 1;
	}
	for(int i=b[q][id].l;i<=y;i++){
		if(a[i][id]>0)  return 1;
	}
	return 0;
}
int getminf(int x,int y,int id){
	int p=belong[x][id],q=belong[y][id],ans=0;
	if(p==q){
		for(int i=x;i<=y;i++){if(a[i][id]<0) ans=min(ans,a[i][id]);}
		return ans;
	}else{
		for(int i=x;i<=b[p][id].r;i++){if(a[i][id]<0)  ans=min(ans,a[i][id]);}
		for(int i=p+1;i<q;i++){
			if(b[i][id].minf) ans=min(ans,b[i][id].minf); 
		}
		for(int i=b[q][id].l;i<=y;i++){if(a[i][id]<0)  ans=min(ans,a[i][id]);}
		return ans;
	}
}
int getmaxf(int x,int y,int id){
	int p=belong[x][id],q=belong[y][id],ans=-0x3fffffffffffffff;
	if(p==q){
		for(int i=x;i<=y;i++){if(a[i][id]<0) ans=max(ans,a[i][id]);}
		return ans;
	}else{
		for(int i=x;i<=b[p][id].r;i++){if(a[i][id]<0)  ans=max(ans,a[i][id]);}
		for(int i=p+1;i<q;i++){
			if(b[i][id].maxf) ans=max(ans,b[i][id].maxf); 
		}
		for(int i=b[q][id].l;i<=y;i++){if(a[i][id]<0)  ans=max(ans,a[i][id]);}
		return ans;
	}
}
int getminz(int x,int y,int id){
	int p=belong[x][id],q=belong[y][id],ans=0x3fffffffffffffff;
	if(p==q){
		for(int i=x;i<=y;i++){if(a[i][id]>0) ans=min(ans,a[i][id]);}
		return ans;
	}else{
		for(int i=x;i<=b[p][id].r;i++){if(a[i][id]>0)  ans=min(ans,a[i][id]);}
		for(int i=p+1;i<q;i++){
			if(b[i][id].minz) ans=min(ans,b[i][id].minz); 
		}
		for(int i=b[q][id].l;i<=y;i++){if(a[i][id]>0)  ans=min(ans,a[i][id]);}
		return ans;
	}
}
int getmaxz(int x,int y,int id){
	int p=belong[x][id],q=belong[y][id],ans=0;
	if(p==q){
		for(int i=x;i<=y;i++){if(a[i][id]>0) ans=max(ans,a[i][id]);}
		return ans;
	}else{
		for(int i=x;i<=b[p][id].r;i++){if(a[i][id]>0)  ans=max(ans,a[i][id]);}
		for(int i=p+1;i<q;i++){
			if(b[i][id].maxz) ans=max(ans,b[i][id].maxz); 
		}
		for(int i=b[q][id].l;i<=y;i++){if(a[i][id]>0)  ans=max(ans,a[i][id]);}
		return ans;
	}
}
signed main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++) cin>>a[i][0];
	for(int i=1;i<=m;i++) cin>>a[i][1];
	build();
	while(q--){
		cin>>l1>>r1>>l2>>r2;
		if(gethavez(l1,r1,0)&&gethavef(l1,r1,0)&&gethavez(l2,r2,1)&&gethavef(l2,r2,1)){//+-  +-
			if(gethavezero(l1,r1,0)){
//				cout<<"SB1"<<endl;
				cout<<0<<endl;
			}else{
				cout<<max(getmaxf(l1,r1,0)*getmaxz(l2,r2,1),getminz(l1,r1,0)*getminf(l2,r2,1))<<endl;
			}//ok
		}else{
			if(gethavez(l1,r1,0)&&(!gethavef(l1,r1,0))&&gethavez(l2,r2,1)&&gethavef(l2,r2,1)){//+  +-
				if(gethavezero(l1,r1,0)){
//					cout<<"SB2"<<endl;
					cout<<0<<endl;
				}else{
					cout<<getminz(l1,r1,0)*getminf(l2,r2,1)<<endl;
				}
			}else{
				if((!gethavez(l1,r1,0))&&gethavef(l1,r1,0)&&gethavez(l2,r2,1)&&gethavef(l2,r2,1)){//- +-
					if(gethavezero(l1,r1,0)){
//						cout<<"SB3"<<endl;
						cout<<0<<endl;
					}else{
						cout<<getmaxf(l1,r1,0)*getmaxz(l2,r2,1)<<endl;
					}
				}else{
					if(gethavez(l1,r1,0)&&gethavef(l1,r1,0)&&(!gethavez(l2,r2,1))&&gethavef(l2,r2,1)){//+-  -
						if(gethavezero(l2,r2,1)){
//							cout<<"SB4"<<endl;
							cout<<0<<endl;
						}else{
							cout<<getminf(l1,r1,0)*getmaxf(l2,r2,1)<<endl; 
						}
					}else{
						if(gethavez(l1,r1,0)&&gethavef(l1,r1,0)&&gethavez(l2,r2,1)&&(!gethavef(l2,r2,1))){//+- +
							if(gethavezero(l2,r2,1)) {
//								cout<<"SB5"<<endl;
								cout<<0<<endl;
							}else{
								cout<<getmaxz(l1,r1,0)*getminz(l2,r2,1)<<endl;
							}
						}else{ 
							if(gethavez(l1,r1,0)&&(!gethavef(l1,r1,0))&&gethavez(l2,r2,1)&&(!gethavef(l2,r2,1))){//+ +
								if(gethavezero(l2,r2,1)){
									cout<<0<<endl;
								}else{
									cout<<getmaxz(l1,r1,0)*getminz(l2,r2,1)<<endl;
								}
							}else{
								if(gethavez(l1,r1,0)&&(!gethavef(l1,r1,0))&&(!gethavez(l2,r2,1))&&gethavef(l2,r2,1)){//+ -
									if(gethavezero(l1,r1,0)){
//										cout<<"SB6"<<endl;
										cout<<0<<endl;
									}else{
										cout<<getminz(l1,r1,0)*getminf(l2,r2,1)<<endl;
									}
								}else{
									if((!gethavez(l1,r1,0))&&gethavef(l1,r1,0)&&(!gethavez(l2,r2,1))&&gethavef(l2,r2,1)){//- -
										if(gethavezero(l2,r2,1)){
											cout<<0<<endl;
										}else{
											cout<<getminf(l1,r1,0)*getmaxf(l2,r2,1)<<endl;
										}
									}else{
										if((!gethavez(l1,r1,0))&&gethavef(l1,r1,0)&&gethavez(l2,r2,1)&&(!gethavef(l2,r2,1))){//- +
											if(gethavezero(l1,r1,0)){
//												cout<<"SB7"<<endl;
												cout<<0<<endl;
											}else{
												cout<<getmaxf(l1,r1,0)*getminz(l2,r2,1)<<endl;
											}
										}else{
//											cout<<"SB8"<<endl;
											cout<<0<<endl;//0 0
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}
	return 0;
}

2024/7/22 16:23
加载中...