ST表求助
查看原帖
ST表求助
502658
Ray662楼主2023/10/15 10:36

 // Problem : [P8818] Game
 // OJ : Luogu
 // Time Limit : 1,000 ms
 // Memory Limit : 512.00 MB

 // Hala Madrid!

#include <bits/stdc++.h>
#define re register
#define ll long long
#define _for(i, a, b)  for (re int i = (int)(a); i <= (int)(b); i ++ )
using namespace std;
const int N = 1e5 + 5, M = 20, inf = 0x7f7f7f7f;
int n, m, Q, l, r, L, R, A[N], B[N], pw[M], bel[N];
ll ans, s[N], p[4][N][M], q[4][N][M];  // 0 - 最小,1 - 最大,2 - 最大非正数,3 - 最小非负数 
inline ll calc(ll (& a)[4][(int)1e5 + 5][20], int o, int al, int ar) {
	int k = bel[ar - al + 1];
	if ((! o) || o == 3)  return min(a[o][al][k], a[o][ar - pw[k] + 1][k]);
	return max(a[o][al][k], a[o][ar - pw[k] + 1][k]);
}
signed main() {
	ios :: sync_with_stdio(false), cin.tie(0), cout.tie(0);
	cin >> n >> m >> Q;
	_for (i, 1, n)  cin >> A[i];
	_for (i, 1, m)  cin >> B[i];
	_for (i, 0, M - 1)  pw[i] = (1 << i);
	_for (i, 2, max(n, m))  bel[i] = bel[i >> 1] + 1;
	_for (i, 1, n) {
		p[0][i][0] = p[1][i][0] = A[i];
		if (A[i] < 0)  p[2][i][0] = A[i], p[3][i][0] = inf;
		if (A[i] > 0)  p[2][i][0] = - inf, p[3][i][0] = A[i];
		if (! A[i])  p[2][i][0] = p[3][i][0] = 0;
	}
	_for (i, 1, m) {
		q[0][i][0] = q[1][i][0] = B[i];
		if (B[i] < 0)  q[2][i][0] = B[i], q[3][i][0] = inf;
		if (B[i] > 0)  q[2][i][0] = - inf, q[3][i][0] = B[i];
		if (! B[i])  q[2][i][0] = q[3][i][0] = 0;
	}
	_for (j, 1, M - 1)  for (int i = 1; i + pw[j] - 1 <= n; i ++ )
		p[0][i][j] = min(p[0][i][j - 1], p[0][i + pw[j - 1]][j - 1]),
		p[1][i][j] = max(p[1][i][j - 1], p[1][i + pw[j - 1]][j - 1]),
		p[2][i][j] = max(p[2][i][j - 1], p[2][i + pw[j - 1]][j - 1]),
		p[3][i][j] = min(p[3][i][j - 1], p[3][i + pw[j - 1]][j - 1]);
	_for (j, 1, M - 1)  for (int i = 1; i + pw[j] - 1 <= m; i ++ )
		q[0][i][j] = min(q[0][i][j - 1], q[0][i + pw[j - 1]][j - 1]),
		q[1][i][j] = max(q[1][i][j - 1], q[1][i + pw[j - 1]][j - 1]),
		q[2][i][j] = max(q[2][i][j - 1], q[2][i + pw[j - 1]][j - 1]),
		q[3][i][j] = min(q[3][i][j - 1], q[3][i + pw[j - 1]][j - 1]);
	while (Q -- ) {
		cin >> l >> r >> L >> R, ans = - inf;
		if (calc(q, 0, L, R) >= 0) {
			if (calc(p, 1, l, r) > 0)  ans = max(ans, calc(p, 1, l, r) * calc(q, 3, L, R));
			else  ans = max(ans, calc(p, 2, l, r) * calc(q, 1, L, R));
		}
		if (calc(q, 1, L, R) <= 0) {
			if (calc(p, 0, l, r) < 0)  ans = max(ans, calc(p, 0, l, r) * calc(q, 2, L, R));
			else  ans = max(ans, calc(p, 3, l, r) * calc(q, 0, L, R));
		}
		if (calc(q, 0, L, R) < 0 && calc(q, 1, L, R) > 0) {
			if (! calc(p, 2, l, r))  ans = max(ans, 0ll);
			if (calc(p, 1, l, r) <= 0)  ans = max(ans, calc(p, 2, l, r) * calc(q, 1, L, R));
			if (calc(p, 0, l, r) >= 0)  ans = max(ans, calc(p, 3, l, r) * calc(q, 0, L, R));
			if (calc(p, 0, l, r) < 0 && calc(p, 1, l, r) > 0)  ans = max(ans, max(calc(p, 2, l, r) * calc(q, 1, L, R), calc(p, 3, l, r) * calc(q, 0, L, R)));
		}
		cout << ans << endl;
	}
//	while (Q -- ) {
//		cin >> l >> r >> L >> R, ans = - inf;
//		_for (i, 0, 3)  _for (j, 0, 3)  if (abs(calc(p, i, l, r)) != inf && abs(calc(q, j, L, R)) != inf)ans = max(ans, calc(p, i, l, r) * calc(q, j, L, R));
//		cout << ans << endl;
//	}
	return 0;
}
2023/10/15 10:36
加载中...