65pts求助,为什么我只拿到了特殊性质的分?
查看原帖
65pts求助,为什么我只拿到了特殊性质的分?
556455
AllureLove2410喜欢若彤楼主2022/11/2 23:12

rt,记录

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int xrt=1e5+3;
int n,m,q;
int a[xrt],b[xrt];
struct zsm{
	int l,r;
	int mins,maxs;
	int minsabs;//感觉好浪费 
	bool flag;
};
bool fc;
zsm ta[xrt<<2],tb[xrt<<2];
void builda(int x,int l,int r){
	ta[x].l=l,ta[x].r=r;
	if(l==r){
		ta[x].maxs=a[l];
		ta[x].mins=a[l];
		ta[x].minsabs=abs(a[l]);
		if(a[l]<0)ta[x].flag=true;
		return;
	}
	int mid=l+((r-l)>>1);
	builda(x<<1,l,mid);
	builda(x<<1|1,mid+1,r);
	ta[x].maxs=max(ta[x<<1].maxs,ta[x<<1|1].maxs);
	ta[x].mins=min(ta[x<<1].mins,ta[x<<1|1].mins);
	if(ta[x<<1].minsabs<ta[x<<1|1].minsabs){
		ta[x].minsabs=ta[x<<1].minsabs;
		ta[x].flag=ta[x<<1].flag;
	}else{
		ta[x].minsabs=ta[x<<1|1].minsabs;
		ta[x].flag=ta[x<<1|1].flag;
	}
//	ta[x].minsabs=min(ta[x<<1].minsabs,ta[x<<1|1].minsabs);
	return;
}
void buildb(int x,int l,int r){
	tb[x].l=l,tb[x].r=r;
	if(l==r){
		tb[x].maxs=b[l];
		tb[x].mins=b[l];
		tb[x].minsabs=abs(b[l]);
		return;
	}
	int mid=l+((r-l)>>1);
	buildb(x<<1,l,mid);
	buildb(x<<1|1,mid+1,r);
	tb[x].maxs=max(tb[x<<1].maxs,tb[x<<1|1].maxs);
	tb[x].mins=min(tb[x<<1].mins,tb[x<<1|1].mins);
	return;
}
int minab(int x,int l,int r){//这里出问题了 
	if(ta[x].l>=l&&ta[x].r<=r){
		int ans=1;
		ans-=ta[x].flag*2;
		return ta[x].minsabs*ans;
	}
	int mid=ta[x].l+((ta[x].r-ta[x].l)>>1);
	int ans=1e18;
	if(l<=mid){
		int k=minab(x<<1,l,r);
		if(k<abs(ans)){
			ans=k;
		}
		if(k==abs(ans)&&k==0-ans){
			fc = true;
		}else fc=false;
	}
	if(r>mid){
		int k=minab(x<<1|1,l,r);
		if(k<abs(ans)){
			ans=k;
		}
		if(k==abs(ans)&&k==0-ans){
			fc = true;
		}else fc = false;
	}
	return ans;
}
int mina,minb,minabs,maxa,maxb;
int fmina(int x,int l,int r){
	if(ta[x].l>=l&&ta[x].r<=r){
		return ta[x].mins;
	}
	int mid=ta[x].l+((ta[x].r-ta[x].l)>>1);
	int ans=1e18;
	if(l<=mid){
		ans=min(ans,fmina(x<<1,l,r));
	}
	if(r>mid){
		ans=min(ans,fmina(x<<1|1,l,r));
	}
	return ans;
}
int fminb(int x,int l,int r){
	if(tb[x].l>=l&&tb[x].r<=r){
		return tb[x].mins;
	}
	int mid=tb[x].l+((tb[x].r-tb[x].l)>>1);
	int ans=1e18;
	if(l<=mid){
		ans=min(ans,fminb(x<<1,l,r));
	}
	if(r>mid){
		ans=min(ans,fminb(x<<1|1,l,r));
	}
	return ans;
} 
int fmaxa(int x,int l,int r){
	if(ta[x].l>=l&&ta[x].r<=r){
		return ta[x].maxs;
	}
	int mid=ta[x].l+((ta[x].r-ta[x].l)>>1);
	int ans=-1e18;
	if(l<=mid){
		ans=max(ans,fmaxa(x<<1,l,r));
	}
	if(r>mid){
		ans=max(ans,fmaxa(x<<1|1,l,r));
	}
	return ans;
} 
int fmaxb(int x,int l,int r){
	if(tb[x].l>=l&&tb[x].r<=r){
		return tb[x].maxs;
	}
	int mid=tb[x].l+((tb[x].r-tb[x].l)>>1);
	int ans=-1e18;
	if(l<=mid){
		ans=max(ans,fmaxb(x<<1,l,r));
	}
	if(r>mid){
		ans=max(ans,fmaxb(x<<1|1,l,r));
	}
	return ans;
} 
int la,ra,lb,rb;
void work(){
	fc=false;
	mina=fmina(1,la,ra);
	minb=fminb(1,lb,rb);
	minabs=minab(1,la,ra);
	maxa=fmaxa(1,la,ra);
	maxb=fmaxb(1,lb,rb);
	return;
}
int ua,ub;
void check(){
	cout<<"\na:\n";
	cout<<mina<<" "<<maxa<<" "<<minabs<<"\n";
	cout<<"b:\n";cout<<minb<<" "<<maxb<<"\n";
	
}
signed main(){
	ios::sync_with_stdio(0);
	cin.tie(0),cout.tie(0);
	//freopen("game.in","r",stdin);
	//freopen("game.out","w",stdout);
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	builda(1,1,n);
	for(int i=1;i<=m;i++){
		cin>>b[i];
	}
	buildb(1,1,m);
	for(int i=1;i<=q;i++){
		cin>>la>>ra>>lb>>rb;
		work();
		//check();
		if(minb<0&&maxb>0){
		//	if(fc==false){
				ua=minabs;
		//	}
			
		}else if(minb>0){
			ua=maxa;
		}else ua=mina;
		if(mina<0&&maxa>0){
			if(ua>0){
				ub=minb;
			}else ub=maxb;
		}else if(maxa<0){
			ub=maxb;
		}else ub=minb;
		int qwe=ua*ub;
		if(fc==true){
			
		if(minb<0&&maxb>0){
		//	if(fc==false){
				ua=minabs;
		//	}
			
		}else if(minb>0){
			ua=maxa;
		}else ua=mina;
		if(mina<0&&maxa>0){
			if(ua>0){
				ub=minb;
			}else ub=maxb;
		}else if(maxa<0){
			ub=maxb;
		}else ub=minb;
		}
		cout<<max(ua*ub,qwe)<<"\n";
	}
	return 0;
}
2022/11/2 23:12
加载中...