社区讨论

编译没过求助

灌水区参与者 2已保存回复 5

讨论操作

快速查看讨论及其快照的属性,并进行相关操作。

当前回复
5 条
当前快照
1 份
快照标识符
@lo7o4r4x
此快照首次捕获于
2023/10/27 05:00
2 年前
此快照最后确认于
2023/10/27 05:00
2 年前
查看原帖
CPP
#include <cstdio>
#include <algorithm>
#define Positive [&](int x) {return x >= 0;}
#define Negative [&](int x) {return x <= 0;}
#define Greater [&](int x, int y) {return x > y;}
#define Less [&](int x, int y) {return x < y;}
typedef long long ll;
const int N = 1e5, M = 20, INF = 1 << 30;
const ll INFLL = 1ll << 60;
int n, m, q;
int a[N + 7], b[N + 7];
int mnap[N + 7][M], mxap[N + 7][M], mnbp[N + 7][M], mxbp[N + 7][M];
int mnan[N + 7][M], mxan[N + 7][M], mnbn[N + 7][M], mxbn[N + 7][M];
inline void init(int mn[N + 7][M], int mx[N + 7][M], int arr[N + 7], int siz, bool lim(int x)) {
	for(int i = 1; i <= siz; i++) {
		if(lim(arr[i]))
			mn[i][0] = mx[i][0] = arr[i];
		else mn[i][0] = INF, mx[i][0] = -INF;
	}
	for(int i = 1, len = 2; len <= siz; i++, len <<= 1) {
		for(int l = 1, mid = 1 + (len >> 1), r = len; r <= siz; l++, mid++, r++) {
			mn[l][i] = std::min(mn[l][i - 1], mn[mid][i - 1]);
			mx[l][i] = std::max(mx[l][i - 1], mx[mid][i - 1]);
		}
	}
}
inline int calc(int arr[N + 7][M], int l, int r, bool cmp(int x, int y)) {
	const int lg = std::__lg(r - l + 1), len = 1 << lg;
	return std::min(arr[l][lg], arr[r - len + 1][lg], cmp);
}
int main() {
	freopen("game.in", "r", stdin);
	freopen("game.out", "w", stdout);
	scanf("%d %d %d", &n, &m, &q);
	for(int i = 1; i <= n; i++)
		scanf("%d", &a[i]);
	for(int i = 1; i <= m; i++)
		scanf("%d", &b[i]);
	init(mnap, mxap, a, n, Positive);
	init(mnbp, mxbp, b, m, Positive);
	init(mnan, mxan, a, n, Negative);
	init(mnbn, mxbn, b, m, Negative);
	while(q--) {
		int l1, r1, l2, r2;
		scanf("%d %d %d %d", &l1, &r1, &l2, &r2);
		int minap = calc(mnap, l1, r1, Less), maxap = calc(mxap, l1, r1, Greater);
		int minbp = calc(mnbp, l2, r2, Less), maxbp = calc(mxbp, l2, r2, Greater);
		int minan = calc(mnan, l1, r1, Less), maxan = calc(mxan, l1, r1, Greater);
		int minbn = calc(mnbn, l2, r2, Less), maxbn = calc(mxbn, l2, r2, Greater);
		ll resp = -INFLL, resn = -INFLL;
		if(maxap >= 0) {
			if(minbn <= 0)
				resp = (ll) minap * minbn;
			else resp = (ll) maxap * minbp;
		}
		if(minan <= 0) {
			if(maxbp >= 0)
				resn = (ll) maxan * maxbp;
			else resn = (ll) minan * maxbn;
		}
		printf("%lld\n", std::max(resp, resn));
	}
	return 0;
}
草,痛失 1=,我该怎么办

回复

5 条回复,欢迎继续交流。

正在加载回复...