65pts 为啥没有特殊性质1的点都没过?
查看原帖
65pts 为啥没有特殊性质1的点都没过?
1422328
TaoHongXi楼主2024/10/14 23:06
#include <bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N = 100100, M = 20, INF = 1e9;

int maxl[N][M], maxq[N][M], minl[N][M], minq[N][M];
int mip[N][M], man[N][M];
int Log[N];
int n, m, q;
int a[N], b[N];

void init(){
	for(int i=2;i<N;i++) Log[i] = Log[i>>1]+1;
	
	for(int j=0;j<M;j++)
		for(int i=1;i+(1<<j)-1<=max(n,m);i++)
		if(!j){
			maxl[i][j] = minl[i][j] = a[i], maxq[i][j] = minq[i][j] = b[i];
			
			if(a[i]>=0) mip[i][j] = a[i], man[i][j] = -INF;
			else mip[i][j] = INF, man[i][j] = a[i];
		}
		else{
			maxl[i][j] = max(maxl[i][j-1],maxl[i+(1<<j-1)][j-1]);
			maxq[i][j] = max(maxq[i][j-1],maxq[i+(1<<j-1)][j-1]);
			minl[i][j] = min(minl[i][j-1],minl[i+(1<<j-1)][j-1]);
			minq[i][j] = min(minq[i][j-1],minq[i+(1<<j-1)][j-1]);
			man[i][j] = max(man[i][j-1],man[i+(1<<j-1)][j-1]);
			mip[i][j] = min(mip[i][j-1],mip[i+(1<<j-1)][j-1]);
		}
}

int main(){
	scanf("%d%d%d",&n,&m,&q);
	for(int i=1;i<=n;i++) scanf("%d",&a[i]);
	for(int i=1;i<=m;i++) scanf("%d",&b[i]);
	init();
	
	while(q--){
		int l1, r1, l2, r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		int j1 = Log[r1-l1+1], j2 = Log[r2-l2+1];
		int x0 = max(maxl[l1][j1],maxl[r1-(1<<j1)+1][j1]);
		int x1 = min(minl[l1][j1],minl[r1-(1<<j1)+1][j1]);
		int y0 = max(maxq[l2][j2],maxq[r2-(1<<j2)+1][j2]);
		int y1 = min(minq[l2][j2],minq[r2-(1<<j2)+1][j2]);
		if(x0<=0&&y0<=0) printf("%lld\n",(LL)x1*y0);
		else if(x1>0&&y0<=0) printf("%lld\n",(LL)x1*y1);
		else if(x0<=0&&y1>0) printf("%lld\n",(LL)x0*y0);
		else if(x1>0&&y1>0) printf("%lld\n",(LL)x0*y1);
		else if(x0>0&&x1<=0&&y0>0&&y1<=0){
			int x = max(man[l1][j1],man[r1-(1<<j1)+1][j1]), y = min(mip[l1][j1],mip[r1-(1<<j1)+1][j1]);
			if(abs(x)<abs(y)||(abs(x)==abs(y)&&abs(y0)<abs(y1))) printf("%lld\n",(LL)x*y0);
			else printf("%lld\n",(LL)y*y1);
		}
		else if(x0>=0&&x1<=0&&y1>0) printf("%lld\n",(LL)x0*y1);
		else if(x0>=0&&x1<=0&&y1<=0) printf("%lld\n",(LL)x1*y0);
		else if(x1>0&&y0>=0&&y1<=0) printf("%lld\n",(LL)x1*y1);
		else if(x1<=0&&y0>=0&&y1<=0) printf("%lld\n",(LL)x0*y0);
		//else puts("???");
	}
	
	
	return 0;
}
2024/10/14 23:06
加载中...