50pts求调
查看原帖
50pts求调
422387
VIOLET__FOREVER楼主2022/11/2 16:03
#include<bits/stdc++.h>
using namespace std;
#define int long long
inline int read(){
	int f=1,x=0;char c=getchar();
	for(;!isdigit(c);c=getchar())if(c=='-')f=-1;
	for(;isdigit(c);c=getchar())x=(x<<3)+(x<<1)+(c^48);
	return x*f; 
}
const int N=100005;
int n,m,q,flag=1,num,h[N],numl,hl[N];
int maxx,minn;
int a[N],b[N];
signed main(){
	cin>>n>>m>>q;
	for(int i=1;i<=n;i++){
		a[i]=read();
		if(a[i]<=0) flag=0; 
	}
	for(int i=1;i<=m;i++){
		b[i]=read();
		if(b[i]<=0) flag=0;
	}
	if(flag){
		while(q--){
			int l1=read(),r1=read(),l2=read(),r2=read();
			maxx=-1e9,minn=1e9;
			for(int i=l1;i<=r1;i++){
				if(a[i]>maxx) maxx=a[i];
			}
			for(int i=l2;i<=r2;i++){
				if(b[i]<minn) minn=b[i];
			}
			printf("%lld\n",maxx*minn);
		}
	}
	else{
		while(q--){
			int l1=read(),r1=read(),l2=read(),r2=read();
			maxx=-1e9,minn=1e9;
			if(l1==r1){
				if(a[l1]>0){
					for(int i=l2;i<=r2;i++){
						if(b[i]<minn) minn=b[i];
					}
					printf("%lld\n",a[l1]*minn);
				}
				else if(a[l1]==0) cout<<"0"<<endl;
				else{
					for(int i=l2;i<=r2;i++){
						if(maxx<b[i]) maxx=b[i];
					}
					printf("%lld\n",a[l1]*maxx);
				}
			}
			else if(l2==r2){
				if(b[l2]>0){
					for(int i=l1;i<=r1;i++){
						if(a[i]>maxx) maxx=a[i];
					}
					printf("%lld\n",b[l2]*maxx);
				}
				else if(b[l2]==0) puts("0");
				else{
					for(int i=l1;i<=r1;i++){
						if(a[i]<minn) minn=a[i];
					}
					printf("%lld\n",b[l2]*minn);
				}
			}
			else{
				num=0,numl=0;
				bool pd=0,pdl=0;
				int ll,rr,l,r;
				for(int i=l2;i<=r2;i++){
					num++;
					if(b[i]==0) pd=1;
					h[num]=b[i];
				}
				for(int i=l1;i<=r1;i++){
					numl++;
					if(a[i]==0) pdl=1;
					hl[numl]=a[i];
				}
				sort(h+1,h+1+num);
				sort(hl+1,hl+1+numl);
				if(h[num]>0){
					if(h[1]<0){
						if(pdl) puts("0");
						else{
							for(int i=1;i<=num;i++){
								if(h[i]<0 && h[i+1]>=0) l=h[i];
								else if(h[i]>0 && h[i-1]<=0) r=h[i];
							}
							for(int i=1;i<=numl;i++){
								if(hl[i]<0 && hl[i+1]>=0) ll=hl[i];
								else if(hl[i]>0 && hl[i-1]<=0) rr=hl[i];
							}
							printf("%lld\n",max(ll*h[num],rr*h[1]));
						}
					}
					else if(h[1]>0){
						if(hl[numl]>0) printf("%lld\n",hl[numl]*h[1]);
						else if(hl[numl]<0) printf("%lld\n",hl[numl]*h[num]);
						else puts("0");
					}
					else{
						if(hl[numl]>0) puts("0");
						else if(hl[numl]<0) printf("%lld\n",hl[numl]*h[num]);
						else puts("0");
					}
				}
				else{
					if(hl[numl]<0){
						if(pd) puts("0");
						else printf("%lld\n",hl[1]*h[num]);
					}
					else if(hl[1]>0) printf("%lld\n",hl[1]*h[1]);
					else if(hl[1]<0 && hl[numl]>0){
						if(pd) puts("0");
						else printf("%lld\n",h[num]*hl[1]);
					}
					else if(hl[1]==0) puts("0");
				}
			}
		}
	}
	return 0;
} 
2022/11/2 16:03
加载中...