ST表40pts求调
查看原帖
ST表40pts求调
1288333
XURUIFAN楼主2025/8/5 11:29

test link
code:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 100010;
const ll INF = LLONG_MAX, FINF = LLONG_MIN;
int n, m, q;
ll a, b, st[10][N][20], lg[N];
int l1, l2, r1, r2;
int main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);
	cin >> n >> m >> q;
	memset(st, 0x3f, sizeof(st));
	for (int i = 1; i <= n; i++) {
		cin >> a;
		st[1][i][0] = st[2][i][0] = a;
		if (a < 0) {
			st[3][i][0] = a;
			st[4][i][0] = INF;
		} else {
			st[3][i][0] = FINF;
			st[4][i][0] = a;
		}

	}
	for (int i = 1; i <= m; i++) {
		cin >> b;
		st[5][i][0] = st[6][i][0] = b;
	}
	for (int i = 2; i <= max(n, m); i++)
		lg[i] = lg[i >> 1] + 1;
	for (int i = 1; i < 18; i++) {
		for (int j = 1; j + (1 << i) - 1 <= n; j++) {
			int p = j + (1 << (i - 1));
			st[1][j][i] = max(st[1][j][i - 1], st[1][p][i - 1]);
			st[2][j][i] = min(st[2][j][i - 1], st[2][p][i - 1]);
			st[3][j][i] = max(st[3][j][i - 1], st[3][p][i - 1]);
			st[4][j][i] = min(st[4][j][i - 1], st[4][p][i - 1]);
		}
		for (int j = 1; j + (1 << i) - 1 <= m; j++) {
			int p = j + (1 << (i - 1));
			st[5][j][i] = max(st[5][j][i - 1], st[5][p][i - 1]);
			st[6][j][i] = min(st[6][j][i - 1], st[6][p][i - 1]);
		}
	}
	while (q--) {
		cin >> l1 >> r1 >> l2 >> r2;
		int sa = lg[r1 - l1 + 1], sb = lg[r2 - l2 + 1];
		int pa = r1 - (1 << sa) + 1, pb = r2 - (1 << sb) + 1;
		ll amax = max(st[1][l1][sa], st[1][pa][sa]);
		ll amin = min(st[2][l1][sa], st[1][pa][sa]);
		ll afmx = max(st[3][l1][sa], st[3][pa][sa]);
		ll azmn = min(st[4][l1][sa], st[4][pa][sa]);
		ll bmax = max(st[5][l2][sb], st[5][pb][sb]);
		ll bmin = min(st[6][l2][sb], st[6][pb][sb]);
		ll ans = FINF;
		if (amax < 0)ans = bmax * (bmax < 0 ? amin : amax);
		else if (amin >= 0) ans = bmin * (bmin >= 0 ? amax : amin);
		else if (bmax < 0) ans = amin * bmax;
		else if (bmin >= 0) ans = amax * bmin;
		else ans = max(azmn * bmin, afmx * bmax);
		cout << ans << "\n";
	}
	return 0;
}
2025/8/5 11:29
加载中...