社区讨论
编译没过求助
灌水区参与者 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 条回复,欢迎继续交流。
正在加载回复...