ST表只有45分,求条玄关
查看原帖
ST表只有45分,求条玄关
725816
Perfect_Youth楼主2025/6/20 17:08

rt.

代码如下:

#include <bits/stdc++.h>
#define int long long

using namespace std;

inline
int read() {
	int x = 0, f = 1;
	char ch = getchar();
	while (ch < '0' or ch > '9') {
		if (ch == '-') f = -1;
		ch = getchar();
	}
	while (ch >= '0' && ch <= '9') {
		x = (x << 1) + (x << 3) + (ch ^ '0');
		ch = getchar();
	}
	return x * f;
}

const int N = 1e5 + 7;

int n, m, q, a[N], b[N], ans, tmp;

int log_2[N], st_max_b[N][27], st_min_b[N][27], st_max_a_fu[N][27], st_max_a_zheng[N][27], st_min_a_fu[N][27], st_min_a_zheng[N][27];

inline
int query_max_b(int l, int r) {
	int k = log_2[r - l + 1];
	return max(st_max_b[l][k], st_max_b[r - (1 << k) + 1][k]);
}

inline
int query_min_b(int l, int r) {
	int k = log_2[r - l + 1];
	return min(st_min_b[l][k], st_min_b[r - (1 << k) + 1][k]);
}

inline
int query_max_a_fu(int l, int r) {
	int k = log_2[r - l + 1];
	return max(st_max_a_fu[l][k], st_max_a_fu[r - (1 << k) + 1][k]);
}

inline
int query_min_a_fu(int l, int r) {
	int k = log_2[r - l + 1];
	return min(st_min_a_fu[l][k], st_min_a_fu[r - (1 << k) + 1][k]);
}

inline
int query_max_a_zheng(int l, int r) {
	int k = log_2[r - l + 1];
	return max(st_max_a_zheng[l][k], st_max_a_zheng[r - (1 << k) + 1][k]);
}

inline
int query_min_a_zheng(int l, int r) {
	int k = log_2[r - l + 1];
	return min(st_min_a_zheng[l][k], st_min_a_zheng[r - (1 << k) + 1][k]);
}

signed main() {
	// freopen("game3.in", "r", stdin);
	// freopen("game.out", "w", stdout);
	n = read(), m = read(), q = read();
	for (int i = 1; i <= n; i++) a[i] = read();
	for (int i = 1; i <= m; i++) b[i] = read();
	for (int i = 2; i <= max(n, m); i++) log_2[i] = log_2[i >> 1] + 1;
	for (int i = 1; i <= m; i++) {
		st_max_b[i][0] = b[i];
		st_min_b[i][0] = b[i];
	}
	for (int i = 1; i <= n; i++) {
		if (a[i] < 0) {
			st_max_a_zheng[i][0] = -1e9;
			st_min_a_zheng[i][0] = 1e9;
			st_max_a_fu[i][0] = a[i];
			st_min_a_fu[i][0] = a[i];
		} else {
			st_max_a_fu[i][0] = -1e9;
			st_min_a_fu[i][0] = 1e9;
			st_max_a_zheng[i][0] = a[i];
			st_min_a_zheng[i][0] = a[i];
		}
	}
	for (int j = 1; (1 << j) <= n; j++) {
		for (int i = 1; i <= n - (1 << j) + 1; i++) {
			st_max_a_fu[i][j] = max(st_max_a_fu[i][j - 1], st_max_a_fu[i + (1 << j - 1)][j - 1]);
			st_min_a_fu[i][j] = min(st_min_a_fu[i][j - 1], st_min_a_fu[i + (1 << j - 1)][j - 1]);
			st_max_a_zheng[i][j] = max(st_max_a_zheng[i][j - 1], st_max_a_zheng[i + (1 << j - 1)][j - 1]);
			st_min_a_zheng[i][j] = min(st_min_a_zheng[i][j - 1], st_min_a_zheng[i + (1 << j - 1)][j - 1]);
		}
	}
	for (int j = 1; (1 << j) <= m; j++) {
		for (int i = 1; i <= m - (1 << j) + 1; i++) {
			st_max_b[i][j] = max(st_max_b[i][j - 1], st_max_b[i + (1 << j - 1)][j - 1]);
			st_min_b[i][j] = min(st_min_b[i][j - 1], st_min_b[i + (1 << j - 1)][j - 1]);
		}
	}
	for (int l1, r1, l2, r2; q--; ) {
		l1 = read(), r1 = read(), l2 = read(), r2 = read();
		ans = -1e18, tmp = query_min_b(l2, r2);
		if (tmp >= 0) {
			ans = max(ans, tmp * query_max_a_zheng(l1, r1));
		} else {
			ans = max(ans, tmp * query_min_a_zheng(l1, r1)); 
		}
		tmp = query_max_b(l2, r2);
		if (tmp >= 0) {
			ans = max(ans, tmp * query_max_a_fu(l1, r1));
		} else {
			ans = max(ans, tmp * query_min_a_fu(l1, r1));
		}
//		for (int i = l1; i <= r1; i++) {
//			if (!a[i]) ans = max(ans, 0ll);
//			else if (a[i] > 0) {
//				tmp = query_min(l2, r2);
//				ans = max(ans, a[i] * tmp);
//			} else if (a[i] < 0) {
//				tmp = query_max(l2, r2);
//				ans = max(ans, a[i] * tmp);
//			}
//		}
		printf ("%lld\n", ans);
	}
	return 0;
}
//6 4 5
//3 -1 -2 1 2 0
//1 2 -1 -3
//
//1 6 1 4
//
//1 5 1 4
//
//-3 * 1
//2 * -1
//
//1 4 1 2
//2 6 3 4
//2 5 2 3

只要条对一定会关的qwq。

2025/6/20 17:08
加载中...