40pts 求调
查看原帖
40pts 求调
993236
Restart_Justin猫猫虫楼主2024/10/11 18:27
#include <bits/stdc++.h>
using namespace std;
const int maxn = 1e5 + 5;
int n, m, q, a[maxn], b[maxn], amin[maxn][25], amax[maxn][25], anmax[maxn][25], apmin[maxn][25], bmin[maxn][25], bmax[maxn][25], lg2[maxn];
void init() {
    memset(amin, 0x3f, (n + 1) * 20 * 4);
    memset(amax, ~0x3f, (n + 1) * 20 * 4);
    memset(anmax, ~0x3f, (n + 1) * 20 * 4);
    memset(apmin, 0x3f, (n + 1) * 20 * 4);
    memset(bmin, 0x3f, (n + 1) * 20 * 4);
    memset(bmax, ~0x3f, (n + 1) * 20 * 4);
    for (int i = n; i >= 1; i--) {
        amin[i][0] = a[i];
        for (int j = 1; i + (1 << j) - 1 <= n; j++)
            amin[i][j] = min(amin[i][j - 1], amin[i + (1 << j - 1)][j - 1]);
    }
    for (int i = n; i >= 1; i--) {
        amax[i][0] = a[i];
        for (int j = 1; i + (1 << j) - 1 <= n; j++)
            amax[i][j] = max(amax[i][j - 1], amax[i + (1 << j - 1)][j - 1]);
    }
    for (int i = n; i >= 1; i--) {
        if (a[i] < 0)
            anmax[i][0] = a[i];
        for (int j = 1; i + (1 << j) - 1 <= n; j++)
            anmax[i][j] = max(anmax[i][j - 1], anmax[i + (1 << j - 1)][j - 1]);
    }
    for (int i = n; i >= 1; i--) {
        if (a[i] >= 0)
            apmin[i][0] = a[i];
        for (int j = 1; i + (1 << j) - 1 <= n; j++)
            apmin[i][j] = min(apmin[i][j - 1], apmin[i + (1 << j - 1)][j - 1]);
    }
    for (int i = m; i >= 1; i--) {
        bmin[i][0] = b[i];
        for (int j = 1; i + (1 << j) - 1 <= m; j++)
            bmin[i][j] = min(bmin[i][j - 1], bmin[i + (1 << j - 1)][j - 1]);
    }
    for (int i = m; i >= 1; i--) {
        bmax[i][0] = b[i];
        for (int j = 1; i + (1 << j) - 1 <= m; j++)
            bmax[i][j] = max(bmax[i][j - 1], bmax[i + (1 << j - 1)][j - 1]);
    }
    for (int i = 2; i <= max(n, m); i++)
        lg2[i] = lg2[i >> 1] + 1;
}
int get_amin(int l, int r) {
    int lg = lg2[r - l + 1];
    return min(amin[l][lg], amin[r - (1 << lg) + 1][lg]);
}
int get_amax(int l, int r) {
    int lg = lg2[r - l + 1];
    return max(amax[l][lg], amax[r - (1 << lg) + 1][lg]);
}
int get_anmax(int l, int r) {
    int lg = lg2[r - l + 1];
    return max(anmax[l][lg], anmax[r - (1 << lg) + 1][lg]);
}
int get_apmin(int l, int r) {
    int lg = lg2[r - l + 1];
    return min(apmin[l][lg], apmin[r - (1 << lg) + 1][lg]);
}
int get_bmin(int l, int r) {
    int lg = lg2[r - l + 1];
    return min(bmin[l][lg], bmin[r - (1 << lg) + 1][lg]);
}
int get_bmax(int l, int r) {
    int lg = lg2[r - l + 1];
    return min(bmax[l][lg], bmax[r - (1 << lg) + 1][lg]);
}
int main() {
    ios::sync_with_stdio(0);
    cin.tie(0), cout.tie(0);
    cin >> n >> m >> q;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 1; i <= m; i++)
        cin >> b[i];
    init();
    while (q--) {
        int l1, r1, l2, r2;
        cin >> l1 >> r1 >> l2 >> r2;
        if (get_bmin(l2, r2) < 0 && get_bmax(l2, r2) >= 0) {
            if (get_apmin(l1, r1) != 0x3f3f3f3f && get_anmax(l1, r1) != 0x3f3f3f3f)
                cout << max(1LL * get_apmin(l1, r1) * get_bmin(l2, r2), 1LL * get_anmax(l1, r1) * get_bmax(l2, r2)) << "\n";
            else if (get_apmin(l1, r1) != 0x3f3f3f3f)
                cout << 1LL * get_apmin(l1, r1) * get_bmin(l2, r2) << "\n";
            else
                cout << 1LL * get_anmax(l1, r1) * get_bmax(l2, r2) << "\n";
        } else if (get_bmax(l2, r2) < 0)
            cout << min(1LL * get_amin(l1, r1) * get_bmin(l2, r2), 1LL * get_amin(l1, r1) * get_bmax(l2, r2)) << "\n";
        else
            cout << min(1LL * get_amax(l1, r1) * get_bmin(l2, r2), 1LL * get_amax(l1, r1) * get_bmax(l2, r2)) << "\n";
    }
}

/kk

2024/10/11 18:27
加载中...