官方数据100pts luogu数据95pts求助
查看原帖
官方数据100pts luogu数据95pts求助
593538
TorchMar楼主2022/11/16 17:16

rt,WA on 13#

#include<bits/stdc++.h>
#define int long long
#define mid ((l+r)>>1)
#define ls (k<<1)
#define rs ((k<<1)|1)
using namespace std;
const int N=1e5+5;
const int inf=LONG_LONG_MAX;
int n,m,q,a[N],b[N],bm[N<<2],bmn[N<<2],am[N<<2],amn[N<<2],az[N<<2],af[N<<2];
inline int re() {
	int f=1,x=0;
	char ch=getchar();
	while(!isdigit(ch)) {
		f=ch=='-'?-f:f;
		ch=getchar();
	}
	while(isdigit(ch)) {
		x=(x<<3)+(x<<1)+(ch^48);
		ch=getchar();
	}
	return f*x;
}
inline int minn(int a,int b) {
	if(a == -inf) return b;
	if(b == -inf) return a;
	return min(a,b);
}
inline int maxx(int a,int b) {
	if(a == inf) return b;
	if(b == inf) return a;
	return max(a,b);
}
inline void upda(int k) {
	am[k]=max(am[ls],am[rs]);
	amn[k]=min(amn[ls],amn[rs]);
	az[k]=minn(az[ls],az[rs]);
	af[k]=maxx(af[ls],af[rs]);
}
inline void updb(int k) {
	bm[k]=max(bm[ls],bm[rs]);
	bmn[k]=min(bmn[ls],bmn[rs]);
}
inline void builda(int k,int l,int r) {
	if(l==r) {
		am[k]=amn[k]=a[l];
		if(a[l]>=0) az[k]=a[l],af[k]=inf;
		else af[k]=a[l],az[k]=-inf;
		return ;
	}
	builda(ls,l,mid);
	builda(rs,mid+1,r);
	upda(k);
}
inline void buildb(int k,int l,int r) {
	if(l==r) {
		bm[k]=bmn[k]=b[l];
		return ;
	}
	buildb(ls,l,mid);
	buildb(rs,mid+1,r);
	updb(k);
}
inline int qrybm(int k,int l,int r,int al,int ar) {
	if(al<=l && r<=ar) return bm[k];
	int ans=-inf;
	if(al<=mid) ans=max(ans,qrybm(ls,l,mid,al,ar));
	if(mid<ar) ans=max(ans,qrybm(rs,mid+1,r,al,ar));
	return ans;
}
inline int qrybmn(int k,int l,int r,int al,int ar) {
	if(al<=l && r<=ar) return bmn[k];
	int ans=inf;
	if(al<=mid) ans=min(ans,qrybmn(ls,l,mid,al,ar));
	if(mid<ar) ans=min(ans,qrybmn(rs,mid+1,r,al,ar));
	return ans;
}
inline int qryam(int k,int l,int r,int al,int ar) {
	if(al<=l && r<=ar) return am[k];
	int ans=-inf;
	if(al<=mid) ans=max(ans,qryam(ls,l,mid,al,ar));
	if(mid<ar) ans=max(ans,qryam(rs,mid+1,r,al,ar));
	return ans;
}
inline int qryamn(int k,int l,int r,int al,int ar) {
	if(al<=l && r<=ar) return amn[k];
	int ans=inf;
	if(al<=mid) ans=min(ans,qryamn(ls,l,mid,al,ar));
	if(mid<ar) ans=min(ans,qryamn(rs,mid+1,r,al,ar));
	return ans;
}
inline int qryaz(int k,int l,int r,int al,int ar) {
	if(al<=l && r<=ar) return az[k];
	int ans=inf;
	if(al<=mid) ans=minn(ans,qryaz(ls,l,mid,al,ar));
	if(mid<ar) ans=minn(ans,qryaz(rs,mid+1,r,al,ar));
	return ans;
}
inline int qryaf(int k,int l,int r,int al,int ar) {
	if(al<=l && r<=ar) return af[k];
	int ans=-inf;
	if(al<=mid) ans=maxx(ans,qryaf(ls,l,mid,al,ar));
	if(mid<ar) ans=maxx(ans,qryaf(rs,mid+1,r,al,ar));
	return ans;
}
inline void solve() {
	int la=re(),ra=re(),lb=re(),rb=re();
	int amax=qryam(1,1,n,la,ra);
	int amin=qryamn(1,1,n,la,ra);
	int azm=qryaz(1,1,n,la,ra);
	int afm=qryaf(1,1,n,la,ra);
	int bmax=qrybm(1,1,m,lb,rb);
	int bmin=qrybmn(1,1,m,lb,rb);
	int ans=-inf;
	ans=max(ans,amax*(amax>=0?bmin:bmax));
	ans=max(ans,amin*(amin>=0?bmin:bmax));
	if(afm!=-inf) ans=max(ans,afm*(afm>=0?bmin:bmax));
	if(azm!=inf) ans=max(ans,azm*(azm>=0?bmin:bmax));
	cout<<ans<<endl;
}
signed main() {
	n=re(),m=re(),q=re();
	for(int i=1; i<=n; i++) a[i]=re();
	for(int i=1; i<=m; i++) b[i]=re();
	builda(1,1,n);
	buildb(1,1,m);
	while(q--) solve();
	return 0;
}
2022/11/16 17:16
加载中...