线段树0pts求调
查看原帖
线段树0pts求调
681840
stardust_dragon楼主2023/9/21 18:26
#include<bits/stdc++.h>
using namespace std;
#define N 100010
#define INF 1000000001
#define ll long long
int n,m,q;
int a[N],b[N];
struct node
{
	int l;
	int r;
	ll maxsum;
	ll minsum;
	ll zmax;
	ll zmin;
} ta[N*4],tb[N*4];
void build1(int id,int l,int r)
{
	if (l==r)
		{
		ta[id].l = l;
		ta[id].r = r;
		ta[id].maxsum = a[l];
		ta[id].minsum = a[l];
		if (a[l]<0) ta[id].zmax = a[l],ta[id].zmin = INF;
		else ta[id].zmax = -INF,ta[id].zmin = a[l];
		return;
		}
	ta[id].l = l;
	ta[id].r = r;
	int mid = (l+r)/2;
	int lid = id*2,rid = id*2+1;
	build1(lid,l,mid);
	build1(rid,mid+1,r);
	ta[id].maxsum = max(ta[lid].maxsum,ta[rid].maxsum);
	ta[id].minsum = min(ta[lid].minsum,ta[rid].minsum);
	ta[id].zmax = max(ta[lid].zmax,ta[rid].zmax);
	ta[id].zmin = min(ta[lid].zmin,ta[rid].zmin);
}
void build2(int id,int l,int r)
{
	if (l==r)
		{
		tb[id].l = l;
		tb[id].r = r;
		tb[id].maxsum = b[l];
		tb[id].minsum = b[l];
		return;
		}
	tb[id].l = l;
	tb[id].r = r;
	int mid = (l+r)/2;
	int lid = id*2,rid = id*2+1;
	build2(lid,l,mid);
	build2(rid,mid+1,r);
	tb[id].maxsum = max(tb[lid].maxsum,tb[rid].maxsum);
	tb[id].minsum = min(tb[lid].minsum,tb[rid].minsum);
}
struct nodea
{
	ll maxsum;
	ll minsum;
	ll zmax;
	ll zmin;
};
nodea ask1(int id,int l,int r)
{
	nodea x;
	if (l<=ta[id].l and r>=ta[id].r)
		{
		x.maxsum = ta[id].maxsum;
		x.minsum = ta[id].minsum;
		x.zmax = ta[id].zmax;
		x.zmin = ta[id].zmin;
		return x;
		}
	int mid = (ta[id].l+ta[id].r)/2;
	int lid = id*2,rid = id*2+1;
	nodea v1;
	nodea v2;
	v1.maxsum = v2.maxsum = -INF;
	v1.minsum = v2.minsum = INF;
	v1.zmax = v2.zmax = -INF;
	v1.zmin = v2.zmin = INF;
	if (l<=mid) v1 = ask1(lid,l,mid);
	if (r>mid) v2 = ask1(rid,mid+1,r);
	x.maxsum = max(v1.maxsum,v2.maxsum);
	x.minsum = min(v1.minsum,v2.minsum);
	x.zmax = max(v1.zmax,v2.zmax);
	x.zmin = min(v1.zmin,v2.zmin);
	return x;
}
struct nodeb
{
	ll maxsum;
	ll minsum;
};
nodeb ask2(int id,int l,int r)
{
	nodeb x;
	if (l<=tb[id].l and r>=tb[id].r)
		{
		x.maxsum = tb[id].maxsum;
		x.minsum = tb[id].minsum;
		return x;
		}
	int mid = (tb[id].l+tb[id].r)/2;
	int lid = id*2;
	int rid = id*2+1;
	nodeb v1,v2;
	v1.maxsum = v2.maxsum = -INF;
	v1.minsum = v2.minsum = INF;
	if (l<=mid) v1 = ask2(lid,l,mid);
	if (r>mid) v2 = ask2(rid,mid+1,r);
	x.maxsum = max(v1.maxsum,v2.maxsum);
	x.minsum = min(v1.minsum,v2.minsum);
	return x;
}
int 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);
	for (int i=1;i<=q;i++)
		{
		int l1,r1,l2,r2;
		cin>>l1>>r1>>l2>>r2;
		nodea aa;
		nodeb bb;
		aa = ask1(1,l1,r1);
		bb = ask2(1,l2,r2);
		//cout<<aa.maxsum<<' '<<aa.minsum<<' '<<aa.zmax<<' '<<aa.zmin<<endl;
		//cout<<bb.maxsum<<' '<<bb.minsum<<endl;
		int ans1=-INF,ans2=-INF;
		if (aa.zmin<INF)
			{
			ans1 = max(aa.maxsum*bb.minsum,aa.zmin*bb.minsum);
			}
		if (aa.zmax>-INF)
			{
			ans2 = max(aa.minsum*bb.maxsum,aa.zmax*bb.maxsum);
			}
		cout<<max(ans1,ans2)<<endl;
		}
}
2023/9/21 18:26
加载中...