捞 求调 25pts 线段树
查看原帖
捞 求调 25pts 线段树
377153
流水行船CCD楼主2023/7/10 10:39

#include<bits/stdc++.h>
#define SZ 10005
#define INF 1e9+7
#define ll long long
#define pr pair<pair<ll,ll>,pair<ll,ll>>
#define mp(x,y,z,c) make_pair(make_pair(x,y),make_pair(z,c))
using namespace std;
int n,m,q;
ll A[SZ],B[SZ];
struct SegmentTree{
	int l,r;
	ll ma,mi,fma,fmi;
}trA[5*SZ],trB[5*SZ];
void pushup(int u,SegmentTree tr[]){
	tr[u].ma=max(tr[u<<1].ma,tr[u<<1|1].ma);
	tr[u].mi=min(tr[u<<1].mi,tr[u<<1|1].mi);
	tr[u].fma=max(tr[u<<1].fma,tr[u<<1|1].fma);
	tr[u].fmi=min(tr[u<<1].fmi,tr[u<<1|1].fmi);
	return;
}
void Build(int u,int l,int r,SegmentTree tr[],ll num[]){
	tr[u].l=l;tr[u].r=r;
	if(l==r){
		tr[u].ma=tr[u].mi=num[l];
		if(num[l]>=0){
			tr[u].fmi=num[l];tr[u].fma=-INF;
		}else{
			tr[u].fma=num[l];tr[u].fmi=INF;
		}
		return;
	}
	int mid=(l+r)>>1;
	Build(u<<1,l,mid,tr,num);
	Build(u<<1|1,mid+1,r,tr,num);
	pushup(u,tr);
	return;
}
pr Ask(int u,int l,int r,SegmentTree tr[]){
	//cout<<u<<' '<<tr[u].l<<' '<<tr[u].r<<' '<<l<<' '<<r<<'\n';
	if(l<=tr[u].l&&tr[u].r<=r){
		//cout<<"Back"<<endl;
		return mp(tr[u].ma,tr[u].mi,tr[u].fma,tr[u].fmi);
	}
	int mid=(tr[u].l+tr[u].r)>>1;
	ll U1=-INF,U2=INF,U3=-INF,U4=INF;pr V;
	if(l<=mid){
		V=Ask(u<<1,l,r,tr);
		U1=max(U1,V.first.first);
		U2=min(U2,V.first.second);
		U3=max(U3,V.second.first);
		U4=min(U4,V.second.second);
	}
	if(r>mid){
		V=Ask(u<<1|1,l,r,tr);
		U1=max(U1,V.first.first);
		U2=min(U2,V.first.second);
		U3=max(U3,V.second.first);
		U4=min(U4,V.second.second);
	}
	pushup(u,tr);
	return mp(U1,U2,U3,U4);
}
signed main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){cin>>A[i];}Build(1,1,n,trA,A);
	for(int i=1;i<=m;i++){cin>>B[i];}Build(1,1,n,trB,B);
	for(int i=1,l1,r1,l2,r2;i<=q;i++){
		cin>>l1>>r1>>l2>>r2;
		pr Na=Ask(1,l1,r1,trA),Nb=Ask(1,l2,r2,trB);
		ll tmp=-1e18;
		tmp=max(tmp,Na.first.first*(Na.first.first>=0?Nb.first.second:Nb.first.first));
		tmp=max(tmp,Na.first.second*(Na.first.second>=0?Nb.first.second:Nb.first.first));
		tmp=max(tmp,Na.second.first*Nb.first.first);
		tmp=max(tmp,Na.second.second*Nb.first.second);
		cout<<tmp<<endl;
	}
	return 0;
}

2023/7/10 10:39
加载中...