代码求调
查看原帖
代码求调
473071
ztlh楼主2022/11/1 13:17

lg上AC,InfOJ上WA了,40pts,错的都是没有性质1的点。

#include<bits/stdc++.h>
#define ll long long
#define N 100005
#define Inf 1000000000000000005
using namespace std;
ll read(){
	ll x=0,f=1; char c=getchar();
	while(c!='-'&&(c<'0'||c>'9')) c=getchar();
	if(c=='-') f=-1,c=getchar();
	while(c>='0'&&c<='9') x=(x<<1)+(x<<3)+c-'0',c=getchar();
	return x*f;
}
int n,m,q;
ll a[N];
ll b[N];
struct STree{
	int l,r;
	ll maxn,minn;
	ll zminn,fmaxn;
}ta[N*4],tb[N*4];
int l1,l2,r1,r2;
ll amx,amn,bmx,bmn,azn,afx,ans;
void PushUp(STree tr[],int u,bool type){
	tr[u].maxn=max(tr[u<<1].maxn,tr[u<<1|1].maxn);
	tr[u].minn=min(tr[u<<1].minn,tr[u<<1|1].minn);
	if(type){
		tr[u].fmaxn=max(tr[u<<1].fmaxn,tr[u<<1|1].fmaxn);
		tr[u].zminn=min(tr[u<<1].zminn,tr[u<<1|1].zminn);
	}
}
void Build(STree tr[],int u,int l,int r,ll c[],bool type){
	tr[u].l=l; tr[u].r=r;
	if(l==r){
		tr[u].maxn=tr[u].minn=c[l];
		if(type){
			if(a[l]>0){
				tr[u].zminn=a[l];
				tr[u].fmaxn=-Inf;
			}
			else if(a[l]<0){
				tr[u].zminn=Inf;
				tr[u].fmaxn=a[l];
			}
			else if(a[l]==0){
				tr[u].zminn=a[l];
				tr[u].fmaxn=a[l];
			}
		}
		return ;
	}
	int mid=l+r>>1;
	Build(tr,u<<1,l,mid,c,type);
	Build(tr,u<<1|1,mid+1,r,c,type);
	PushUp(tr,u,type);
}
ll QMax(STree tr[],int u,int l,int r,ll c[],int L,int R){
	if(L<=l&&r<=R) return tr[u].maxn;
	int mid=l+r>>1;
	ll mx=-Inf;
	if(L<=mid) mx=max(mx,QMax(tr,u<<1,l,mid,c,L,R));
	if(R>mid) mx=max(mx,QMax(tr,u<<1|1,mid+1,r,c,L,R));
	return mx;
}
ll QMin(STree tr[],int u,int l,int r,ll c[],int L,int R){
	if(L<=l&&r<=R) return tr[u].minn;
	int mid=l+r>>1;
	ll mn=Inf;
	if(L<=mid) mn=min(mn,QMin(tr,u<<1,l,mid,c,L,R));
	if(R>mid) mn=min(mn,QMin(tr,u<<1|1,mid+1,r,c,L,R));
	return mn;
}
ll QFMax(STree tr[],int u,int l,int r,ll c[],int L,int R){
	if(L<=l&&r<=R) return tr[u].fmaxn;
	int mid=l+r>>1;
	ll mx=-Inf;
	if(L<=mid) mx=max(mx,QFMax(tr,u<<1,l,mid,c,L,R));
	if(R>mid) mx=max(mx,QFMax(tr,u<<1|1,mid+1,r,c,L,R));
	return mx;
}
ll QZMin(STree tr[],int u,int l,int r,ll c[],int L,int R){
	if(L<=l&&r<=R) return tr[u].zminn;
	int mid=l+r>>1;
	ll mn=Inf;
	if(L<=mid) mn=min(mn,QZMin(tr,u<<1,l,mid,c,L,R));
	if(R>mid) mn=min(mn,QZMin(tr,u<<1|1,mid+1,r,c,L,R));
	return mn;
}
int main(){
//	freopen("game.in","r",stdin);
//	freopen("game.out","w",stdout);
	n=(int)read(); m=(int)read(); q=(int)read();
	for(int i=1;i<=n;i++) a[i]=read();
	for(int i=1;i<=m;i++) b[i]=read();
	Build(ta,1,1,n,a,1);
	Build(tb,1,1,m,b,0);
	while(q--){
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		amx=QMax(ta,1,1,n,a,l1,r1);
		amn=QMin(ta,1,1,n,a,l1,r1);
		bmx=QMax(tb,1,1,m,b,l2,r2);
		bmn=QMin(tb,1,1,m,b,l2,r2);
		ans=-Inf;
		if(bmn>=0) ans=max(ans,amx*bmn);
		else if(bmx<=0) ans=max(ans,amn*bmx);
		else{
			if(amn>=0) ans=max(ans,amn*bmn);
			else if(amx<=0) ans=max(ans,amx*bmx);
			else{
				azn=QZMin(ta,1,1,n,a,l1,r1);
				afx=QFMax(ta,1,1,n,a,l1,r1);
				ans=max(ans,max(azn*bmn,afx*bmx));
			}
		}
		printf("%lld\n",ans);
	}
	return 0;
}
2022/11/1 13:17
加载中...