95分求助
查看原帖
95分求助
1098596
WhiteNight__楼主2024/10/25 14:20
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
#define ll long long

int n , m , q , lg[100050];
ll a[100050] , b[100050];

struct St_ {
	ll upmax , domax , upmin , domin;
	St_ (ll g = 0){
		upmax = -0x7fffffff;
		upmin = -0x7fffffff;
		domax = 0x7fffffff;
		domin = 0x7fffffff;
		if(g >= 0) 
		{
			upmax = domax = g;
		}
		else if(g < 0) upmin = domin = g;
	}
}sta[100050][27] , stb[100050][27] , ak , bk;

void ask (St_ &g , int l , int r , int mod)
{
	int k = lg[r - l + 1];
	if(mod == 1)
	{
		g.upmax = max (sta[l][k].upmax , sta[r - (1 << k) + 1][k].upmax);
		g.domax = min (sta[l][k].domax , sta[r - (1 << k) + 1][k].domax);
		g.upmin = max (sta[l][k].upmin , sta[r - (1 << k) + 1][k].upmin);
		g.domin = min (sta[l][k].domin , sta[r - (1 << k) + 1][k].domin);
	}
	if(mod == 2)
	{
		g.upmax = max (stb[l][k].upmax , stb[r - (1 << k) + 1][k].upmax);
		g.domax = min (stb[l][k].domax , stb[r - (1 << k) + 1][k].domax);
		g.upmin = max (stb[l][k].upmin , stb[r - (1 << k) + 1][k].upmin);
		g.domin = min (stb[l][k].domin , stb[r - (1 << k) + 1][k].domin);
	}
}

int main()
{
	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]);
	
	for(int i = 1 ; i <= 100005 ; i ++) {
		lg[i] = lg[i-1] + int(1 << (lg[i-1] + 1) == i);
	}
	
	for(int i = n ; i >= 1 ; i --)
	{
		sta[i][0] = St_(a[i]);
		//printf("Btest --> i = %d  j = 0  upmin = %lld\n",i,sta[i][0].upmin);
		for(int j = 1 ; j <= lg[n - i] +1 ; j ++)
		{
			sta[i][j].upmax = max (sta[i][j-1].upmax , sta[i+(1<<(j-1))][j-1].upmax);
			sta[i][j].domax = min (sta[i][j-1].domax , sta[i+(1<<(j-1))][j-1].domax);
			sta[i][j].upmin = max (sta[i][j-1].upmin , sta[i+(1<<(j-1))][j-1].upmin);
			sta[i][j].domin = min (sta[i][j-1].domin , sta[i+(1<<(j-1))][j-1].domin);
			//printf("Atest --> i = %d  j = %d  upmin = %lld\n",i,j,sta[i][j].upmin);
		}
	}
	
	for(int i = m ; i >= 1 ; i --)
	{
		stb[i][0] = St_(b[i]);
		//printf("Btest --> i = %d  j = 0  upmax = %lld\n",i,stb[i][0].upmax);
		for(int j = 1 ; j <= lg[m - i] +1 ; j ++)
		{
			stb[i][j].upmax = max (stb[i][j-1].upmax , stb[i+(1<<(j-1))][j-1].upmax);
			stb[i][j].domax = min (stb[i][j-1].domax , stb[i+(1<<(j-1))][j-1].domax);
			stb[i][j].upmin = max (stb[i][j-1].upmin , stb[i+(1<<(j-1))][j-1].upmin);
			stb[i][j].domin = min (stb[i][j-1].domin , stb[i+(1<<(j-1))][j-1].domin);
			//printf("Btest --> i = %d  j = %d  upmax = %lld\n",i,j,stb[i][j].upmax);
		}
	}
	
	while (q -- > 0)
	{
		int l1 , r1 , l2 , r2;
		scanf("%d%d%d%d",&l1,&r1,&l2,&r2);
		ask(ak , l1 , r1 , 1);
		ask(bk , l2 , r2 , 2);
		
		//printf("A{%lld}  B{%lld}\n",ak.upmin,bk.upmin);
		
		if(bk.domin == 0x7fffffff)
		{
			if(ak.upmax == -0x7fffffff)
			{
				printf("%lld\n",ak.upmin * bk.upmax);
			}
			else printf("%lld\n",ak.upmax * bk.domax);
		}
		else if(bk.upmax == -0x7fffffff)
		{
			if(ak.domin == 0x7fffffff)
			{
				printf("%lld\n",ak.domax * bk.domin);
			}
			else printf("%lld\n",ak.domin * bk.upmin);
		}
		else 
		{
			if(ak.upmin == 0x7fffffff) printf("%lld\n",ak.domax * bk.domin);
			else printf("%lld\n",max(ak.domax*bk.domin,ak.upmin*bk.upmax));
		}
	}
	
	
	return 0;
}

2024/10/25 14:20
加载中...