比赛 20250527CSP-S模拟 评测结果
题目名称 假期计划 最终得分 0
用户昵称 Tim 运行时间 0.000 s
代码语言 C++ 内存使用 0.00 MiB
提交时间 2025-05-27 16:08:08
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N = 1e5+5;
const int maxinf = LONG_LONG_MAX;
const int mininf = LONG_LONG_MIN;

int n, m, q;
int lg2[N];
int amx[N][25], amn[N][25], afx[N][25], azn[N][25];
int bmx[N][25], bmn[N][25];

signed main() {
	freopen("csp2022_game.in", "r", stdin);
	freopen("csp2022_game.out", "w", stdout);
	scanf("%lld%lld%lld", &n, &m, &q);
	for (int i = 2; i <= max(m, n); i++)	lg2[i] = lg2[i >> 1] + 1;
	for (int x, i = 1; i <= n; i++) {
		scanf("%lld", &x);
		amx[i][0] = amn[i][0] = x;
		afx[i][0] = (x > 0 ? mininf : x);
		azn[i][0] = (x >= 0 ? x : maxinf);
	}
	for (int x, i = 1; i <= m; i++) {
		scanf("%lld", &x);
		bmx[i][0] = bmn[i][0] = x;
	}
	for (int k = 1; k <= lg2[n]; k++)
		for (int i = 1; (i + (1 << k) -1) <= n; i++) {
			int mid = i + (1 << (k - 1));
			amx[i][k] = max(amx[i][k - 1], amx[mid][k - 1]);
			amn[i][k] = min(amn[i][k - 1], amn[mid][k - 1]);
			afx[i][k] = max(afx[i][k - 1], afx[mid][k - 1]);
			azn[i][k] = min(azn[i][k - 1], azn[mid][k - 1]);
		}
	for (int k = 1; k <= lg2[m]; k++)
		for (int i = 1; (i + (1 << k) -1) <= m; i++) {
			int mid = i + (1 << (k - 1));
			bmx[i][k] = max(bmx[i][k - 1], bmx[mid][k - 1]);
			bmn[i][k] = min(bmn[i][k - 1], bmn[mid][k - 1]);
		}
	for (int l1, r1, l2, r2, i = 1; i <= q; i++) {
		scanf("%lld%lld%lld%lld", &l1, &r1, &l2, &r2);
		//query
		int pa = lg2[r1 - l1 + 1], pb = lg2[r2 - l2 + 1];
		int ta = r1 - (1 << pa) +1, tb = r2 - (1 << pb) +1;
		int amax = max(amx[l1][pa], amx[ta][pa]);
		int amin = min(amn[l1][pa], amn[ta][pa]);
		int afmx = max(afx[l1][pa], afx[ta][pa]);
		int azmn = min(azn[l1][pa], azn[ta][pa]);
		int bmax = max(bmx[l2][pb], bmx[tb][pb]);
		int bmin = min(bmn[l2][pb], bmn[tb][pb]);
		//get ans
		int ans = mininf;
		ans = max(ans, amax * (amax >= 0 ? bmin : bmax));
		ans = max(ans, amin * (amin >= 0 ? bmin : bmax));
		if (afmx != mininf)
			ans = max(ans, afmx * (afmx >= 0 ? bmin : bmax));
		if (azmn != maxinf)
			ans = max(ans, azmn * (azmn >= 0 ? bmin : bmax));
		printf("%lld\n", ans);
	}
	return 0;
}
/*
x≥0 时,B 会选择最小的 y
x<0 时,B 会选择最大的 y
*/