ST表75分求助
查看原帖
ST表75分求助
767788
HHH6666666666楼主2022/10/30 14:38
#include<bits/stdc++.h>
using namespace std;
#define ll long long

const int MAXN = 100010;
const int NOAB = 1000000001;
const int NOBL = -1000000001;
int n, m, q;
int a[MAXN], b[MAXN];
int lg[MAXN];
int maxa[MAXN][33], mina[MAXN][33], maxb[MAXN][33], minb[MAXN][33];
int aba[MAXN][33], bla[MAXN][33];

int main(){
    scanf("%d%d%d", &n, &m, &q);
    lg[1] = 0;
    int enddd = max(n, m);
    for (int i = 2; i <= enddd; i++){
        lg[i] = lg[i-1] + ((1 << (lg[i-1] + 1)) == i);
    }
    for (int i = 1; i <= n; i++){
        scanf("%d", &a[i]);
        maxa[i][0] = mina[i][0] = a[i];
        if (a[i] >= 0){
            aba[i][0] = a[i]; bla[i][0] = NOBL;
        }
        else{
            bla[i][0] = a[i]; aba[i][0] = NOAB;
        }
    }
    for (int i = 1; i <= m; i++){
        scanf("%d", &b[i]);
        maxb[i][0] = minb[i][0] = b[i];
    }
    for (int k = 1; k <= lg[n]; k++){
        for (int i = 1; i + (1 << k) - 1 <= n; i++){
            maxa[i][k] = max(maxa[i][k-1], maxa[i+(1<<(k-1))][k-1]);
            bla[i][k] = max(bla[i][k-1], bla[i+(1<<(k-1))][k-1]);
            mina[i][k] = min(mina[i][k-1], mina[i+(1<<(k-1))][k-1]);
            aba[i][k] = min(aba[i][k-1], aba[i+(1<<(k-1))][k-1]);
        }
    }
    for (int k = 1; k <= lg[m]; k++){
        for (int i = 1; i + (1 << k) - 1 <= m; i++){
            maxb[i][k] = max(maxb[i][k-1], maxb[i+(1<<(k-1))][k-1]);
            minb[i][k] = min(minb[i][k-1], minb[i+(1<<(k-1))][k-1]);
        }
    }

    int l1, r1, l2, r2;
    int k1, k2;
    int nowmaxa, nowmaxb, nowmina, nowminb, nowaba, nowbla, nowblb, nowabb;
    while (q--){
        scanf("%d%d%d%d", &l1, &r1, &l2, &r2);

        k1 = lg[r1-l1+1];
        k2 = lg[r2-l2+1];

        nowmaxa = max(maxa[l1][k1], maxa[r1-(1<<k1)+1][k1]);
        nowmina = min(mina[l1][k1], mina[r1-(1<<k1)+1][k1]);

        nowbla = max(bla[l1][k1], bla[r1-(1<<k1)+1][k1]);
        nowaba = min(aba[l1][k1], aba[r1-(1<<k1)+1][k1]);

        nowmaxb = max(maxb[l2][k2], maxb[r2-(1<<k2)+1][k2]);
        nowminb = min(minb[l2][k2], minb[r2-(1<<k2)+1][k2]);
        
        if (nowminb > 0){ // All in B is above 0
            if (nowmaxa < 0){
                printf("%lld\n", (ll) nowmaxa * nowmaxb);
            }
            else{
                printf("%lld\n", (ll) nowmaxa * nowminb);
            }
        }
        else if (nowmaxb < 0){
            if (nowmina >= 0){
                printf("%lld\n", (ll) nowmina * nowminb);
            }
            else{
                printf("%lld\n", (ll) nowmina * nowmaxb);
            }
        }
        else{
            printf("%lld\n", max((ll) nowaba * nowminb, (ll) nowbla * nowmaxb));
        }
    }

    return 0;
}
2022/10/30 14:38
加载中...