洛谷数据全过,CCF数据40pts求助
查看原帖
洛谷数据全过,CCF数据40pts求助
359270
是青白呀白鸽子楼主2022/11/8 17:07

只过了特殊性质1的点QWQ

#include<bits/stdc++.h>
#define ls(i) i<<1
#define rs(i) i<<1^1
using namespace std;
const int N=1e5+5,inf=1e9;
const long long inff=1e18+7;
int n,m,q;
struct treeb{
	long long maxn,minn;
}tb[6*N];
struct treea{
	long long maxf,maxn,minn,minz;
}ta[6*N];
long long a[N],b[N];
void builda(int le,int ri,int x){
	if(le==ri){
		ta[x].minn=a[le];
		ta[x].maxn=a[le];
		if(a[le]<0){
			ta[x].maxf=a[le];
     		ta[x].minz=inf;
		}
		else{
			ta[x].minz=a[le];
			ta[x].maxf=-inf;
		}
	//	printf("%d %d %lld\n",le,ri,ta[x].maxf);
		return;
	}
	int mid=(le+ri)>>1;
	builda(le,mid,ls(x));
	builda(mid+1,ri,rs(x));
	ta[x].maxn=max(ta[ls(x)].maxn,ta[rs(x)].maxn);
	ta[x].minn=min(ta[ls(x)].minn,ta[rs(x)].minn);
	ta[x].maxf=max(ta[ls(x)].maxf,ta[rs(x)].maxf);
	ta[x].minz=min(ta[ls(x)].minz,ta[rs(x)].minz);
	//printf("%d %d %lld\n",le,ri,ta[x].maxf);
}
void buildb(int le,int ri,int x){
	if(le==ri){
		tb[x].maxn=b[le];
		tb[x].minn=b[le];
		return;
	}
	int mid=(le+ri)>>1;
	buildb(le,mid,ls(x));
	buildb(mid+1,ri,rs(x));
	tb[x].maxn=max(tb[ls(x)].maxn,tb[rs(x)].maxn);
	tb[x].minn=min(tb[ls(x)].minn,tb[rs(x)].minn);
}
long long findmina(int ql,int qr,int le,int ri,int x){
	if(ql<=le&&qr>=ri)return ta[x].minn;
	long long ret=inf;
	int mid=(le+ri)>>1;
	if(ql<=mid)ret=min(ret,findmina(ql,qr,le,mid,ls(x)));
	if(qr>mid)ret=min(ret,findmina(ql,qr,mid+1,ri,rs(x)));
	return ret;
}
long long findmaxa(int ql,int qr,int le,int ri,int x){
	if(ql<=le&&qr>=ri)return ta[x].maxn;
	long long ret=-inf;
	int mid=(le+ri)>>1;
	if(ql<=mid)ret=max(ret,findmaxa(ql,qr,le,mid,ls(x)));
	if(qr>mid)ret=max(ret,findmaxa(ql,qr,mid+1,ri,rs(x)));
	return ret;
}
long long findminz(int ql,int qr,int le,int ri,int x){
	if(ql<=le&&qr>=ri)return ta[x].minz;
	long long ret=inf;
	int mid=(le+ri)>>1;
	if(ql<=mid)ret=min(ret,findminz(ql,qr,le,mid,ls(x)));
	if(qr>mid)ret=min(ret,findminz(ql,qr,mid+1,ri,rs(x)));
	return ret;
}
long long findmaxf(int ql,int qr,int le,int ri,int x){
	if(ql<=le&&qr>=ri)return ta[x].maxf;
	long long ret=-inf;
	int mid=(le+ri)>>1;
	if(ql<=mid)ret=max(ret,findmaxf(ql,qr,le,mid,ls(x)));
	if(qr>mid)ret=max(ret,findmaxf(ql,qr,mid+1,ri,rs(x)));
	return ret;
}
long long findmaxb(int ql,int qr,int le,int ri,int x){
	if(ql<=le&&qr>=ri)return tb[x].maxn;
	long long ret=-inf;
	int mid=(le+ri)>>1;
	if(ql<=mid)ret=max(ret,findmaxb(ql,qr,le,mid,ls(x)));
	if(qr>mid)ret=max(ret,findmaxb(ql,qr,mid+1,ri,rs(x)));
	return ret;
}
long long findminb(int ql,int qr,int le,int ri,int x){
	if(ql<=le&&qr>=ri)return tb[x].minn;
	long long ret=inf;
	int mid=(le+ri)>>1;
	if(ql<=mid)ret=min(ret,findminb(ql,qr,le,mid,ls(x)));
	if(qr>mid)ret=min(ret,findminb(ql,qr,mid+1,ri,rs(x)));
	return ret;
}
int main(){
//	freopen("game3.in","r",stdin);
//	freopen("game3.out","w",stdout);
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++)
	    scanf("%lld",&a[i]);
	for(int i=1;i<=m;i++)
	    scanf("%lld",&b[i]);
	builda(1,n,1);
	buildb(1,n,1);
	while(q--){
		int l1,r1,l2,r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		long long ans=-inff;
		if(findminb(l2,r2,1,n,1)<0){
			if(findminz(l1,r1,1,n,1)!=inf)ans=max(ans,findminz(l1,r1,1,n,1)*findminb(l2,r2,1,n,1));
			else if(findmaxb(l2,r2,1,n,1)>=0)ans=max(ans,findmaxf(l1,r1,1,n,1)*findmaxb(l2,r2,1,n,1));
			else ans=max(ans,findmina(l1,r1,1,n,1)*findmaxb(l2,r2,1,n,1));
		} 
		else ans=max(ans,findmaxa(l1,r1,1,n,1)*findminb(l2,r2,1,n,1));
		if(findmaxb(l2,r2,1,n,1)>=0){
			if(findmaxf(l1,r1,1,n,1)!=-inf)ans=max(ans,findmaxf(l1,r1,1,n,1)*findmaxb(l2,r2,1,n,1));
			else if(findminb(l2,r2,1,n,1)<0)ans=max(ans,findminz(l1,r1,1,n,1)*findminb(l2,r2,1,n,1));
			else ans=max(ans,findmaxa(l1,r1,1,n,1)*findminb(l2,r2,1,n,1));
		}
		else ans=max(ans,findmina(l1,r1,1,n,1)*findmaxb(l2,r2,1,n,1));
		printf("%lld\n",ans);
	}
	return 0;
}
2022/11/8 17:07
加载中...