比赛 |
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
*/