数据太水
查看原帖
数据太水
596903
JoestarJX的小丑楼主2022/10/31 18:54

数据太水……

错误判断可AC……

#include<bits/stdc++.h>
#define ls rt<<1
#define rs rt<<1|1
using namespace std;
const int N=1e5+5;
int n,m,q,a[N],b[N];
typedef long long ll;
struct node{
	ll Max,Min,Max0,Min0;
	node (ll Max=0,ll Min=0,ll Max0=0,ll Min0=0):Max(Max),Min(Min),Max0(Max0),Min0(Min0){}
}t1[N<<3],t2[N<<3];
void up1(int rt){
	t1[rt].Max=max(t1[ls].Max,t1[rs].Max);
	t1[rt].Min=min(t1[ls].Min,t1[rs].Min);
	int h1,h2;
	h1=t1[ls].Max0,h2=t1[rs].Max0;
	if(h1<=0&&h2<=0) t1[rt].Max0=max(h1,h2);
	else if(h1>0&&h2>0) t1[rt].Max0=1;
	else t1[rt].Max0=(h1<=0?h1:h2);
	h1=t1[ls].Min0,h2=t1[rs].Min0;
	if(h1>=0&&h2>=0) t1[rt].Min0=min(h1,h2);
	else if(h1<0&&h2<0) t1[rt].Min0=-1;
	else t1[rt].Min0=(h1>=0?h1:h2); 
}
void build1(int rt,int l,int r){
	if(l==r){
		t1[rt].Min=t1[rt].Max=a[l];
		t1[rt].Min0=a[l]>=0?a[l]:-1;
		t1[rt].Max0=a[l]<=0?a[l]:1;
		return ;
	}
	int mid=(l+r)>>1;
	build1(ls,l,mid);
	build1(rs,mid+1,r);
	up1(rt);
}
node query1(int rt,int l,int r,int L,int R){
	if(l>=L&&r<=R){
		return t1[rt];
	}
	int mid=(l+r)>>1;
	node ans,ans1,ans2;
	ans1=ans2=ans=node(-1e18,1e18,1,-1);
	if(L<=mid) ans1=query1(ls,l,mid,L,R);
	if(R>mid) ans2=query1(rs,mid+1,r,L,R);
	ans.Max=max(ans1.Max,ans2.Max);
	ans.Min=min(ans1.Min,ans2.Min);
	int h1,h2;
	h1=ans1.Max0,h2=ans2.Max0;
	if(h1<=0&&h2<=0) ans.Max0=max(h1,h2);
	else if(h1>0&&h2>0) ans.Max0=1;
	else ans.Max0=h1<=0?h1:h2;
	h1=ans1.Min0,h2=ans2.Min0;
	if(h1>=0&&h2>=0) ans.Min0=min(h1,h2);
	else if(h1<0&&h2<0) ans.Min0=-1;
	else ans.Min0=h1>=0?h1:h2;
	return ans; 
}
void up2(int rt){
	t2[rt].Max=max(t2[ls].Max,t2[rs].Max);
	t2[rt].Min=min(t2[ls].Min,t2[rs].Min);
	int h1,h2;
	h1=t2[ls].Max0,h2=t2[rs].Max0;
	if(h1<=0&&h2<=0) t2[rt].Max0=max(h1,h2);
	else if(h1>0&&h2>0) t2[rt].Max0=1;
	else t2[rt].Max0=h1<=0?h1:h2;
	h1=t2[ls].Min0,h2=t2[rs].Min0;
	if(h1>=0&&h2>=0) t2[rt].Min0=min(h1,h2);
	else if(h1<0&&h2<0) t2[rt].Min0=-1;
	else t2[rt].Min0=h1>=0?h1:h2; 
}
void build2(int rt,int l,int r){
	if(l==r){
		t2[rt].Min=t2[rt].Max=b[l];
		t2[rt].Min0=b[l]>=0?b[l]:-1;
		t2[rt].Max0=b[l]<=0?b[l]:1;
		return ;
	}
	int mid=(l+r)>>1;
	build2(ls,l,mid);
	build2(rs,mid+1,r);
	up2(rt);
}
node query2(int rt,int l,int r,int L,int R){
	if(l>=L&&r<=R){
		return t2[rt];
	}
	int mid=(l+r)>>1;
	node ans,ans1,ans2;
	ans1=ans2=ans=node(-1e18,1e18,1,-1);
	if(L<=mid) ans1=query2(ls,l,mid,L,R);
	if(R>mid) ans2=query2(rs,mid+1,r,L,R);
	ans.Max=max(ans1.Max,ans2.Max);
	ans.Min=min(ans1.Min,ans2.Min);
	int h1,h2;
	h1=ans1.Max0,h2=ans2.Max0;
	if(h1<=0&&h2<=0) ans.Max0=max(h1,h2);
	else if(h1>0&&h2>0) ans.Max0=1;
	else ans.Max0=h1<=0?h1:h2;
	h1=ans1.Min0,h2=ans2.Min0;
	if(h1>=0&&h2>=0) ans.Min0=min(h1,h2);
	else if(h1<0&&h2<0) ans.Min0=-1;
	else ans.Min0=h1>=0?h1:h2;
	return ans; 
}
int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=m;i++) scanf("%d",&b[i]);
	build1(1,1,n);
	build2(1,1,m);
	while(q--){
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		node md1=query1(1,1,n,l1,r1);
		node md2=query2(1,1,m,l2,r2);
//		printf("md2.Min=%lld\n",md2.Min);
		if(md2.Min>0){
			ll ans1=(ll)md1.Max*md2.Max;
			ll ans2=(ll)md1.Max*md2.Min;	
			printf("%lld\n",min(ans1,ans2));
//			if(md1.Max<0) printf("%lld\n",ans1);
//			else printf("%lld\n",ans2);
		} 
		else if(md2.Max<0){
			ll ans1=(ll)md1.Min*md2.Max;
			ll ans2=(ll)md1.Min*md2.Min;
			printf("%lld\n",min(ans1,ans2));
//			if(md1.Min>0) printf("%lld\n",ans2);
//			else printf("%lld\n",ans1);
		}
		else{
			ll ans1=md1.Max0*md2.Max;
			ll ans2=md1.Min0*md2.Min;
//			if(ans1<=0&&ans2<=0) printf("%lld\n",max(ans1,ans2));洛谷上用这个判断可过 
//			else printf("%lld\n",ans1<=0?ans1:ans2);但在inf oj上会WA,需用下方判断 
			if(md1.Max0<=0&&md1.Min0>=0) printf("%lld\n",max(ans1,ans2));
			else printf("%lld\n",md1.Max0<=0?ans1:ans2);
		}
	} 
	return 0;
} 
2022/10/31 18:54
加载中...