| 比赛 |
20251019新安模拟赛1 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
策略游戏 |
最终得分 |
100 |
| 用户昵称 |
淮淮清子 |
运行时间 |
2.030 s |
| 代码语言 |
C++ |
内存使用 |
51.28 MiB |
| 提交时间 |
2025-10-19 08:59:07 |
显示代码纯文本
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int MAXN = 1e5 + 5;
const int MAXM = 1e5 + 5;
const int LOG = 25;
const int INF = 1e18;
int amax[MAXN][LOG], amin[MAXN][LOG];
int anmx[MAXN][LOG], azmn[MAXN][LOG];
int bmax[MAXM][LOG], bmin[MAXM][LOG];
int lg[MAXN];
function<int(int, int)> maxx = [](int x, int y){return max(x, y);};
function<int(int, int)> minx = [](int x, int y){return min(x, y);};
void build(int *a, int st[][LOG], int n, function<int(int, int)> op){
for(int i = 1;i <= n;i ++) st[i][0] = a[i];
for(int j = 1;j < LOG;j ++)
for(int i = 1; i + (1 << j) - 1 <= n;i ++)
st[i][j] = op(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);
}
int query(int st[][LOG], int l, int r, function<int(int, int)> op){
int k = lg[r - l + 1];
return op(st[l][k], st[r - (1 << k) + 1][k]);
}
int n, m, q;
int a[MAXN], b[MAXM];
signed main(){
freopen("csp2022_game.in", "r", stdin);
freopen("csp2022_game.out", "w", stdout);
ios::sync_with_stdio(false); cin.tie(0);
lg[1] = 0; for(int i = 2;i < MAXN;i ++) lg[i] = lg[i >> 1] + 1;
cin >> n >> m >> q;
for(int i = 1;i <= n;i ++){
cin >> a[i];
amax[i][0] = amin[i][0] = a[i];
anmx[i][0] = (a[i] < 0) ? a[i] : -INF;
azmn[i][0] = (a[i] >= 0) ? a[i] : INF;
}
for(int i = 1;i <= m;i ++){
cin >> b[i]; bmax[i][0] = bmin[i][0] = b[i];
}
build(a, amax, n, maxx); build(a, amin, n, minx);
build(b, bmax, m, maxx); build(b, bmin, m, minx);
for(int j = 1;j < LOG;j ++)
for(int i = 1;i + (1 << j) - 1 <= n;i ++)
anmx[i][j] = maxx(anmx[i][j - 1], anmx[i + (1 << (j - 1))][j - 1]);
for(int j = 1;j < LOG;j ++)
for(int i = 1;i + (1 << j) - 1 <= n;i ++)
azmn[i][j] = minx(azmn[i][j - 1], azmn[i + (1 << (j - 1))][j - 1]);
while(q --){
int l1, r1, l2, r2; cin >> l1 >> r1 >> l2 >> r2;
int A_max = query(amax, l1, r1, maxx), A_min = query(amin, l1, r1, minx);
int A_nmx = query(anmx, l1, r1, maxx), A_zmn = query(azmn, l1, r1, minx);
int B_max = query(bmax, l2, r2, maxx), B_min = query(bmin, l2, r2, minx);
// cout << A_max << ' ' << A_min << ' ' << A_nmx << ' ' << A_zmn << ' ' << B_max << ' ' << B_min << '\n';
auto clc = [&](int x){return x * (x >= 0 ? B_min : B_max);};
int ans = -INF; ans = maxx(ans, clc(A_max)); ans = maxx(ans, clc(A_min));
if(A_nmx != -INF) ans = maxx(ans, clc(A_nmx));
if(A_zmn != INF) ans = maxx(ans, clc(A_zmn));
cout << ans << '\n';
}
return 0;
}