45pts求调
查看原帖
45pts求调
876418
HHYQ_07楼主2023/10/14 11:26

评测记录

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N=1e5+5;
int n,m,q,l1,r1,l2,r2,max1,min1,max2,min2,ans;
int a[N],b[N]; 
struct node
{
	int l,r,minn,maxn,delta1,delta2;
}t1[30*N],t2[30*N];
void build1(int p,int l,int r)
{
	t1[p].l=l,t1[p].r=r;
	if(l==r)
	{
		if(a[l]>=0)
		{
			t1[p].maxn=a[l];
			t1[p].minn=LONG_LONG_MIN;
		}
		else
		{
			t1[p].minn=a[l];
			t1[p].maxn=LONG_LONG_MAX;
		}
		t1[p].delta1=t1[p].delta2=a[l];
		return;
	}
	int mid=l+r>>1;
	build1(p*2,l,mid);
	build1(p*2+1,mid+1,r);
	t1[p].minn=max(t1[p*2].minn,t1[p*2+1].minn);
	t1[p].maxn=min(t1[p*2].maxn,t1[p*2+1].maxn);
	t1[p].delta1=max(t1[p*2].delta1,t1[p*2+1].delta1);
	t1[p].delta2=min(t1[p*2].delta2,t1[p*2+1].delta2);
	return;
}
void build2(int p,int l,int r)
{
	t2[p].l=l,t2[p].r=r;
	if(l==r)
	{
		t2[p].maxn=t2[p].minn=b[l];
		return;
	}
	int mid=l+r>>1;
	build2(p*2,l,mid);
	build2(p*2+1,mid+1,r);
	t2[p].minn=min(t2[p*2].minn,t2[p*2+1].minn);
	t2[p].maxn=max(t2[p*2].maxn,t2[p*2+1].maxn);
	return;
}
int query1_max(int p,int l,int r)//a正数最小值 
{
	if(l<=t1[p].l&&t1[p].r<=r)return t1[p].maxn;
	int mid=t1[p].l+t1[p].r>>1,ans=LONG_LONG_MAX;
	if(l<=mid)ans=min(ans,query1_max(p*2,l,r));
	if(mid<r)ans=min(ans,query1_max(p*2+1,l,r));
	return ans;
}
int query1_min(int p,int l,int r)//a负数最大值 
{
	if(l<=t1[p].l&&t1[p].r<=r)return t1[p].minn;
	int mid=t1[p].l+t1[p].r>>1,ans=LONG_LONG_MIN;
	if(l<=mid)ans=max(ans,query1_min(p*2,l,r));
	if(mid<r)ans=max(ans,query1_min(p*2+1,l,r));
	return ans;
}
int query2_max(int p,int l,int r)//b最大值 
{
	if(l<=t2[p].l&&t2[p].r<=r)return t2[p].maxn;
	int mid=t2[p].l+t2[p].r>>1,ans=LONG_LONG_MIN;
	if(l<=mid)ans=max(ans,query2_max(p*2,l,r));
	if(mid<r)ans=max(ans,query2_max(p*2+1,l,r));
	return ans;
}
int query2_min(int p,int l,int r)//b最小值 
{
	if(l<=t2[p].l&&t2[p].r<=r)return t2[p].minn;
	int mid=t2[p].l+t2[p].r>>1,ans=LONG_LONG_MAX;
	if(l<=mid)ans=min(ans,query2_min(p*2,l,r));
	if(mid<r)ans=min(ans,query2_min(p*2+1,l,r));
	return ans;
}
int query_delta1(int p,int l,int r)//a最大值 
{
	if(l<=t1[p].l&&t1[p].r<=r)return t1[p].delta1;
	int mid=t1[p].l+t1[p].r>>1,ans=LONG_LONG_MIN;
	if(l<=mid)ans=max(ans,query_delta1(p*2,l,r));
	if(mid<r)ans=max(ans,query_delta1(p*2+1,l,r));
	return ans;
}
int query_delta2(int p,int l,int r)//a最小值 
{
	if(l<=t1[p].l&&t1[p].r<=r)return t1[p].delta2;
	int mid=t1[p].l+t1[p].r>>1,ans=LONG_LONG_MAX;
	if(l<=mid)ans=min(ans,query_delta2(p*2,l,r));
	if(mid<r)ans=min(ans,query_delta2(p*2+1,l,r));
	return ans;
}
signed main()
{
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build1(1,1,n);
	for(int i=1;i<=m;i++)
		cin>>b[i];
	build2(1,1,m);
	while(q--)
	{
		cin>>l1>>r1>>l2>>r2;
		max1=query1_max(1,l1,r1);
		min1=query1_min(1,l1,r1);
		max2=query2_max(1,l2,r2);
		min2=query2_min(1,l2,r2);
//		cout<<max1<<" "<<min1<<" "<<max2<<" "<<min2<<endl;
		if(min2>0)
		{
			int sum=query_delta1(1,l1,r1);
			if(sum<0)ans=max2*sum;
			else ans=min2*sum;
		}
		else if(max2<0)
		{
			int sum=query_delta2(1,l1,r1);
			if(sum>0)ans=min2*sum;
			else ans=max2*sum;
		}
		else ans=max(max1*min2,min1*max2);
		cout<<ans<<endl;
	}

	return 0;
}
2023/10/14 11:26
加载中...