】暴力对拍20W次找不出问题:80分ST求hack
查看原帖
】暴力对拍20W次找不出问题:80分ST求hack
409518
Zzz_yigui楼主2023/10/19 19:58
#include<bits/stdc++.h>
using namespace std;
int n,m,q,l1,l2,r1,r2,a[100005],b[100005],t,c[100005],tt;
long long int mxza[100005][20],miza[100005][20],mxfa[100005][20],mifa[100005][20];
long long int mxzb[100005][20],mizb[100005][20],mxfb[100005][20],mifb[100005][20];
long long int ans;
int lb(int x){
	return x&-x;
}
void upd(){
	
	mxza[0][0]=0;
	mxfa[0][0]=0;
	miza[0][0]=1000000009;
	mifa[0][0]=1000000009;
	mxzb[0][0]=0;
	mxfb[0][0]=0;
	mizb[0][0]=1000000009;
	mifb[0][0]=1000000009;
	t=r1-l1+1;
	while(t){
		tt=lb(t);
		t-=tt;
		mxza[0][0]=max(mxza[0][0],mxza[l1][c[tt]]);
		mxfa[0][0]=max(mxfa[0][0],mxfa[l1][c[tt]]);
		miza[0][0]=min(miza[0][0],miza[l1][c[tt]]);
		mifa[0][0]=min(mifa[0][0],mifa[l1][c[tt]]);
		l1+=tt;
	}
	t=r2-l2+1;
	while(t){
		tt=lb(t);
		t-=tt;
		mxzb[0][0]=max(mxzb[0][0],mxzb[l2][c[tt]]);
		mxfb[0][0]=max(mxfb[0][0],mxfb[l2][c[tt]]);
		mizb[0][0]=min(mizb[0][0],mizb[l2][c[tt]]);
		mifb[0][0]=min(mifb[0][0],mifb[l2][c[tt]]);
		l2+=tt;
	}
}
int main(){
	//freopen("date.in","r",stdin);
	//freopen("zj.out","w",stdout); 
	cin>>n>>m>>q;
	t=1;
	for(int i=0;(1<<i)<=max(n,m);i++){
		c[(1<<i)]=i;
	}
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	for(int i=0;i<=n;i++){
		for(int j=0;(1<<j)<=n;j++){
			mxza[i][j]=0;mxfa[i][j]=0;
			miza[i][j]=1000000009;mifa[i][j]=1000000009;
		}
	}
	for(int i=1;i<=n;i++){
		if(a[i]>=0){
			mxza[i][0]=max(0,a[i]);
			miza[i][0]=min(1000000009,a[i]);
		}
		if(a[i]<=0){
			//cout<<a[i]<<" ";
			mxfa[i][0]=max(0,-1*a[i]);
			mifa[i][0]=min(1000000009,-1*a[i]);
		}
	}
	for(int i=1;(1<<i)<=n;i++){
		for(int j=1;j+(1<<(i-1))<=n;j++){
			mxza[j][i]=max(mxza[j][i-1],mxza[j+(1<<(i-1))][i-1]);
			mxfa[j][i]=max(mxfa[j][i-1],mxfa[j+(1<<(i-1))][i-1]);
			miza[j][i]=min(miza[j][i-1],miza[j+(1<<(i-1))][i-1]);
			mifa[j][i]=min(mifa[j][i-1],mifa[j+(1<<(i-1))][i-1]);
			//cout<<mifa[j][i]<<" ";
		}
		//cout<<"**"<<endl;
	}
	for(int i=0;i<=m;i++){
		for(int j=0;(1<<j)<=m;j++){
			mxzb[i][j]=0;mxfb[i][j]=0;
			mizb[i][j]=1000000009;mifb[i][j]=1000000009;
		}
	}
	for(int i=1;i<=m;i++){
		if(b[i]>=0){
			mxzb[i][0]=max(0,b[i]);
			mizb[i][0]=min(1000000009,b[i]);
		}
		if(b[i]<=0){
			mxfb[i][0]=max(0,-1*b[i]);
			mifb[i][0]=min(1000000009,-1*b[i]);
		}

	}
	for(int i=1;(1<<i)<=m;i++){
		for(int j=1;j+(1<<(i-1))<=m;j++){
			mxzb[j][i]=max(mxzb[j][i-1],mxzb[j+(1<<(i-1))][i-1]);
			mxfb[j][i]=max(mxfb[j][i-1],mxfb[j+(1<<(i-1))][i-1]);
			mizb[j][i]=min(mizb[j][i-1],mizb[j+(1<<(i-1))][i-1]);
			mifb[j][i]=min(mifb[j][i-1],mifb[j+(1<<(i-1))][i-1]);
		}
	}
	/*
	for(int i=1;i<=n;i++){
		for(int j=i;j<=n;j++){
			l1=i;r1=j;
			cout<<l1<<"-"<<r1<<":";
			upd();
			cout<<miza[0][0]<<" "<<mxza[0][0]<<" "<<mifa[0][0]*-1<<" "<<mxfa[0][0]*-1<<endl;
		}
	}*/
	
	while(q--){
		cin>>l1>>r1>>l2>>r2;
		upd();/*
		cout<<miza[0][0]<<" "<<mxza[0][0]<<" "<<mifa[0][0]*-1<<" "<<mxfa[0][0]*-1<<endl;
		cout<<mizb[0][0]<<" "<<mxzb[0][0]<<" "<<mifb[0][0]*-1<<" "<<mxfb[0][0]*-1<<endl;*/
		
		if(mifb[0][0]!=1000000009&&mizb[0][0]!=1000000009){
			ans=-1*min(miza[0][0]*mxfb[0][0],mifa[0][0]*mxzb[0][0]);
			cout<<ans<<endl;
			continue;
		}	
		if(mifb[0][0]==1000000009){//b没有负数 
			if(miza[0][0]!=1000000009){  //a有正数 
				ans=mizb[0][0]*mxza[0][0];
				cout<<ans<<endl;
			}
			else{
				ans=-1*mxzb[0][0]*mifa[0][0];
				cout<<ans<<endl;
			}
			continue;
		}
		if(mifa[0][0]!=1000000009){
			ans=mxfa[0][0]*mifb[0][0];
			cout<<ans<<endl;
		}
		else {
			ans=-1*mxfb[0][0]*miza[0][0];
			cout<<ans<<endl;
		}
	}
	return 0;
}
2023/10/19 19:58
加载中...