ST 表 RE 0 分求助,马蜂良好
查看原帖
ST 表 RE 0 分求助,马蜂良好
1431188
Christmas_Defunct楼主2025/1/22 10:12
#include <bits/stdc++.h>
using namespace std;

const int maxn = 1e5 + 10;
const int RE = 0x3f3f3f3f;

int n, a[maxn], p[10][maxn][20];
int m, b[maxn], p1[maxn][20], p2[maxn][20];
int q, l1, r1, l2, r2;

inline void init() {
	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]);
	memset(p[0], -0x3f, sizeof p[0]);
	memset(p[1], 0x3f, sizeof p[1]);
	memset(p[2], -0x3f, sizeof p[2]);
	memset(p[3], 0x3f, sizeof p[3]);
	return ;
}

inline void getST1() {
	for (int i = 1; i <= n; i++) 
		if (a[i] >= 0) p[0][i][0] = p[1][i][0] = a[i];
		else p[2][i][0] = p[3][i][0] = a[i];
	for (int j = 1; (1 << j) <= n; j++) 
		for (int i = 1; i + (1 << j - 1) <= n; i++) {
			p[0][i][j] = max(p[0][i][j - 1], p[0][i + (1 << j - 1)][j - 1]);
			p[1][i][j] = min(p[1][i][j - 1], p[1][i + (1 << j - 1)][j - 1]);
			p[2][i][j] = max(p[2][i][j - 1], p[2][i + (1 << j - 1)][j - 1]);
			p[3][i][j] = min(p[3][i][j - 1], p[3][i + (1 << j - 1)][j - 1]);
		}
	return ;
}

inline int query1(int l, int r, int ord) {
	int t = log2(r - l + 1);
	if (ord % 2) return min(p[ord][l][t], p[ord][r - (1 << t) + 1][t]);
	return max(p[ord][l][t], p[ord][r - (1 << t) + 1][t]);
}

inline void getST2() {
	for (int i = 1; i <= m; i++) p1[i][0] = p2[i][0] = b[i];
	for (int j = 1; (1 << j) <= m; j++) 
		for (int i = 1; i + (1 << j - 1) <= m; i++) {
			p1[i][j] = max(p1[i][j - 1], p1[i + (1 << j - 1)][j - 1]);
			p2[i][j] = min(p2[i][j - 1], p2[i + (1 << j - 1)][j - 1]);
		}
	return ;
}

inline int query2(int l, int r, int ord) {
	int t = log2(r - l + 1);
	if (ord % 2) return max(p1[l][t], p1[r - (1 << t) + 1][t]);
	return min(p2[l][t], p2[r - (1 << t) + 1][t]);
}

inline void solve() {
	scanf("%d %d %d %d", &l1, &r1, &l2, &r2);
	int bmax = query2(l2, r2, 1), bmin = query2(l1, r2, 2);
	int t = 0;
	long long ans = -RE;
	t = query1(l1, r1, 0);
	if (t != -RE) ans = max(ans, 1ll * min(t * bmax, t * bmin));
	t = query1(l1, r1, 1);
	if (t != RE) ans = max(ans, 1ll * min(t * bmax, t * bmin));
	t = query1(l1, r1, 2);
	if (t != -RE) ans = max(ans, 1ll * min(t * bmax, t * bmin));
	t = query1(l1, r1, 3);
	if (t != RE) ans = max(ans, 1ll * min(t * bmax, t * bmin));
	printf("%lld\n", ans);
	return ;
}

signed main() {
	init();
	getST1(), getST2();
	while (q--) solve();
	return 0;
}

目前可以确定是在 solve() 函数中出现的问题,请各位大佬帮忙看看 qwq。

2025/1/22 10:12
加载中...