比赛 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;
}