求大佬帮忙看一下
查看原帖
求大佬帮忙看一下
609170
xin_fu楼主2022/10/30 18:53
#include<bits/stdc++.h>
#define ll long long 
using namespace std;
const int N=1e5+10;

struct TREE{
	ll mx[N<<2],mn[N<<2];
	ll mx1[N<<2],mn1[N<<2];
	bool zeo[N<<2];
	TREE(){memset(mx,128,sizeof mx);
		memset(mn,127,sizeof mn);
		memset(mx1,128,sizeof mx1);
		memset(mn1,127,sizeof mn1); 
	}
	void pushup(int p)
	{
		mx[p]=max(mx[p<<1],mx[p<<1|1]);
		mn[p]=min(mn[p<<1],mn[p<<1|1]);
		mx1[p]=max(mx1[p<<1],mx1[p<<1|1]);
		mn1[p]=min(mn1[p<<1],mn1[p<<1|1]);
	}
	
	void build(int p,int l,int r,int a[])
	{
		if(l==r)
		{
			mx[p]=mn[p]=a[l];
			if(a[l]>0)
			{
				mn1[p]=a[l];
			}
			else if(a[l]<0)
			{
				mx1[p]=a[l];
			}
			else if(!a[l])mx1[p]=mn1[p]=0;
			return;
		}
		int mid=l+r>>1;
		build(p<<1,l,mid,a);
		build(p<<1|1,mid+1,r,a);
		pushup(p);
	}
	
	bool chez1(int p,int l,int r,int le,int ri)
	{
		if(l>=le && r<=ri)
		{
			if(mx[p]>0)return 1;
			else return 0;
		}
		int mid=l+r>>1;
		if(le<=mid && chez1(p<<1,l,mid,le,ri))return 1;
		if(ri>mid && chez1(p<<1|1,mid+1,r,le,ri))return 1;
		return 0;
	}
	
	bool chez2(int p,int l,int r,int le,int ri)
	{
		if(l>=le && r<=ri)
		{
			if(mn[p]<0)return 1;
			else return 0;
		}
		int mid=l+r>>1;
		if(le<=mid && chez2(p<<1,l,mid,le,ri))return 1;
		if(ri>mid && chez2(p<<1|1,mid+1,r,le,ri))return 1;
		return 0;
	}
	bool chez3(int p,int l,int r,int le,int ri)
	{
		if(l>=le && r<=ri)
		{
			if(mx1[p]==0 || mn1[p]==0)return 1;
			else return 0;
		}
		int mid=l+r>>1;
		if(le<=mid && chez3(p<<1,l,mid,le,ri))return 1;
		if(ri>mid && chez3(p<<1|1,mid+1,r,le,ri))return 1;
		return 0;
	}
	
	ll quary1(int p,int l,int r,int le,int ri)
	{
		if(l>=le && r<=ri)
		{
			return mx[p];
		}
		ll mid=l+r>>1;
		ll ans=-1e18;
		if(le<=mid) ans=max(ans,quary1(p<<1,l,mid,le,ri));
		if(ri>mid) ans=max(ans,quary1(p<<1|1,mid+1,r,le,ri));
		return ans;
	}
	
	ll quary2(int p,int l,int r,int le,int ri)
	{
		if(l>=le && r<=ri)
		{
			return mn[p];
		}
		int mid=l+r>>1;
		ll ans=1e18;
		if(le<=mid) ans=min(ans,quary2(p<<1,l,mid,le,ri));
		if(ri>mid) ans=min(ans,quary2(p<<1|1,mid+1,r,le,ri));
		return ans;
	}
	
	ll quary3(int p,int l,int r,int le,int ri)
	{
		if(l>=le && r<=ri)
		{
			return mn1[p];
		}
		int mid=l+r>>1;
		ll ans=1e18;
		if(le<=mid) ans=min(ans,quary3(p<<1,l,mid,le,ri));
		if(ri>mid) ans=min(ans,quary3(p<<1|1,mid+1,r,le,ri));
		return ans;
	}
	
	ll quary4(int p,int l,int r,int le,int ri)
	{
		if(l>=le && r<=ri)
		{
			return mx1[p];
		}
		int mid=l+r>>1;
		ll ans=-1e18;
		if(le<=mid) ans=max(ans,quary4(p<<1,l,mid,le,ri));
		if(ri>mid) ans=max(ans,quary4(p<<1|1,mid+1,r,le,ri));
		return ans;
	}
}tr1,tr2;

int n,m,q;
int a[N],b[N];

int main()
{
//	freopen("game.in","r",stdin);//wyf bless me
//	freopen("game.out","w",stdout);//wyf bless me
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++)
		scanf("%lld",&a[i]);
	for(int i=1;i<=m;i++)
		scanf("%lld",&b[i]);
	tr1.build(1,1,n,a);
	tr2.build(1,1,m,b);
	for(int i=1;i<=q;i++)
	{
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		if(!tr1.chez1(1,1,n,l1,r1))
		{
			if(tr2.chez1(1,1,m,l2,r2))
			{
				cout<<tr1.quary1(1,1,n,l1,r1)*tr2.quary1(1,1,m,l2,r2)<<endl;
			}
			else
			{
				cout<<tr1.quary2(1,1,n,l1,r1)*tr2.quary1(1,1,m,l2,r2)<<endl;
			}
		}
		else if(!tr1.chez2(1,1,n,l1,r1))
		{
			if(tr2.chez2(1,1,m,l2,r2))
			{
				cout<<tr1.quary2(1,1,n,l1,r1)*tr2.quary2(1,1,m,l2,r2)<<endl;
			}
			else
			{
				cout<<tr1.quary1(1,1,n,l1,r1)*tr2.quary2(1,1,m,l2,r2)<<endl;
			}
		}
		else
		{
			if(!tr2.chez1(1,1,m,l2,r2))
			{
				cout<<tr1.quary2(1,1,n,l1,r1)*tr2.quary1(1,1,m,l2,r2)<<endl;
			}
			else if(!tr2.chez2(1,1,m,l2,r2))
			{
				cout<<tr1.quary1(1,1,n,l1,r1)*tr2.quary2(1,1,m,l2,r2)<<endl;
			}
			else if(tr2.chez3(1,1,m,l2,r2) || tr1.chez3(1,1,n,l1,r1))
			{
				cout<<"0"<<endl;
			}
			else
			{
				cout<<max(tr1.quary3(1,1,n,l1,r1)*tr2.quary2(1,1,m,l2,r2),tr1.quary4(1,1,n,l1,r1)*tr2.quary1(1,1,m,l2,r2))<<endl;
			}
		}
	}
	return 0;
}

95pts WA #18

2022/10/30 18:53
加载中...