40pts求助
查看原帖
40pts求助
857665
doumingze楼主2023/10/18 19:30

大样例 game3.in 挂了,game4.in 还没测。

#include<bits/stdc++.h>
using namespace std;

typedef long long LL;
const int N = 1e5 + 10;
int f1max[20][N], f1min[20][N], f2max[20][N], f2min[20][N];
bool f1_0[20][N], f2_0[20][N];
LL f1maxn[20][N], f1minp[20][N];
int a[N], b[N];
int lg2[N];

void init_lg2()
{
	int cnt = 0;
	for(int i = 1; i < N; i <<= 1)
		lg2[i] = cnt ++;
	for(int i = 3; i <= N - 10; i ++)
		if(!lg2[i]) lg2[i] = lg2[i - 1];
}

LL query(int l1, int r1, int l2, int r2)
{
	LL ans = 0;
	int e = lg2[r1 - l1 + 1], f = lg2[r2 - l2 + 1];
	bool p1, z1, n1, p2, z2, n2; //p=positive, z=zero, n=negative
	LL f1x = max(f1max[e][l1], f1max[e][r1 - (1 << e) + 1]);
	LL f2x = max(f2max[f][l2], f2max[f][r2 - (1 << f) + 1]);
	LL f1n = min(f1min[e][l1], f1min[e][r1 - (1 << e) + 1]);
	LL f2n = min(f2min[f][l2], f2min[f][r2 - (1 << f) + 1]);
	LL f1np = min(f1minp[e][l1], f1minp[e][r1 - (1 << e) + 1]);
	LL f1xn = max(f1maxn[e][l1], f1maxn[e][r1 - (1 << e) + 1]);
	//x = maximum, n = minimum
	p1 = f1x > 0;
	z1 = f1_0[e][l1] | f1_0[e][r1 - (1 << e) + 1];
	n1 = f1n < 0;
	p2 = f2x > 0;
	z2 = f2_0[f][l2] | f2_0[f][r2 - (1 << f) + 1];
	n2 = f2n < 0;
	if(p2 && !z2 && !n2)
	{
		if(p1) ans = (LL)(f1x * f2n);
		else ans = (LL)(f1x * f2x);
//		cout << "1" << endl;
	}
	else if(!p2 && z2 && !n2) ans = 0ll;
	else if(!p2 && !z2 && n2)
	{
		if(n1) ans = (LL)f1n * f2x;
		else ans = (LL)f1n * f2n;
//		puts("2");
	}
	else if(p2 && z2 && !n2)
	{
		if(p1 || z1) ans = 0ll;
		else ans = (LL)f1x * f2x;
//		cout << "3" << endl;
	}
	else if(p2 && n2)
	{
		int sta1 = (LL)p1, sta2 = (LL)n1;
		if(z1) ans = 0ll;
		else ans = max(sta1 * (LL)(f1np * f2n), sta2 * (LL)(f1xn * f2x));
//		cout << "4" << endl;
	}
	else if(!p2 && z2 && n2)
	{
		if(z1 || n1) ans = 0ll;
		else ans = (LL)f1n * f2n;
//		puts("5");
	}
	return ans;
}


int main()
{
//	freopen("game3.in", "r", stdin);
//	memset(f1max, -0x3f, sizeof f1max);
//	memset(f2max, -0x3f, sizeof f2max);
//	memset(f1min, 0x3f, sizeof f1min);
//	memset(f2min, 0x3f, sizeof f2min);
//	memset(f1maxn, -0x3f, sizeof f1maxn);
//	memset(f1minp, 0x3f, sizeof f1minp);
	int n, m, q;
	cin >> 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_lg2(); 
	
	int lgn = lg2[n];
	int lgm = lg2[m];
	
	for(int i = 1; i <= n; i ++){
		f1max[0][i] = a[i];	
		f1min[0][i] = a[i];
		f1_0[0][i] = a[i] == 0;
		f1maxn[0][i] = a[i] < 0 ? a[i] : -1e18;
		f1minp[0][i] = a[i] > 0 ? a[i] : 1e18;
	}
	for(int i = 1; i <= lgn; i ++)
		for(int j = 1; j + (1 << i) - 1 <= n; j ++)
		{
			f1max[i][j] = max(f1max[i - 1][j], f1max[i - 1][j + (1 << i - 1)]);
			f1min[i][j] = min(f1min[i - 1][j], f1min[i - 1][j + (1 << i - 1)]);
			f1_0[i][j] = f1_0[i - 1][j] | f1_0[i - 1][j + (1 << i - 1)];
			f1maxn[i][j] = max(f1maxn[i - 1][j], f1maxn[i - 1][j + (1 << i - 1)]);
			f1minp[i][j] = min(f1minp[i - 1][j], f1minp[i - 1][j + (1 << i - 1)]);
		}
	
	for(int i = 1; i <= m; i ++) 
	{
		f2max[0][i] = b[i];
		f2min[0][i] = b[i];
		f2_0[0][i] = b[i] == 0;
	}
	for(int i = 1; i <= lgm; i ++)
		for(int j = 1; j + (1 << i) - 1 <= m; j ++)
		{
			f2max[i][j] = max(f2max[i - 1][j], f2max[i - 1][j + (1 << i - 1)]);
			f2min[i][j] = min(f2min[i - 1][j], f2min[i - 1][j + (1 << i - 1)]);
			f2_0[i][j] = f2_0[i - 1][j] | f2_0[i - 1][j + (1 << i - 1)];
		}	
	
	int l1, l2, r1, r2;
	while(q --)
	{
		scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
		printf("%lld\n", query(l1, r1, l2, r2));
	}
	return 0;
}
2023/10/18 19:30
加载中...