蒟蒻洛谷75分,官方80分求助
查看原帖
蒟蒻洛谷75分,官方80分求助
226183
sam_hengxuan楼主2022/11/11 16:22

https://www.luogu.com.cn/record/93574854

#include <bits/stdc++.h>

using namespace std;

typedef long long LL;
const int MAXN = 100005;
int n, m, q;
LL a[2][MAXN];
struct node {
    int ha0, haz, haf;
    LL maxz, minz, maxf, minf;
}t[5][MAXN * 4];
bool flag;

node make_node(int ha0, int haz, int haf, LL maxz, LL minz, LL maxf, LL minf) {
    node abc;
    abc.ha0 = ha0; abc.haz = haz; abc.haf = haf; abc.maxz = maxz;
    abc.minz = minz; abc.maxf = maxf; abc.minf = minf;
    return abc;
}
node pushup(node ax, node by) {
    node cz;
    cz.ha0 = ax.ha0 | by.ha0;
    cz.haz = ax.haz | by.haz;
    cz.haf = ax.haf | by.haf;
    cz.maxz = max(ax.maxz, by.maxz);
    cz.minz = min(ax.minz, by.minz);
    cz.maxf = max(ax.maxf, by.maxf);
    cz.minf = min(ax.minf, by.minf);
    return cz;
}

void build(int u, int l, int r, int i) {
    if(l == r) {
        t[i][u] = make_node(0, 0, 0, -1e9 - 7, 1e9 + 7, -1e9 - 7, 1e9 + 7);
        if(a[i][l] == 0) {
            t[i][u].ha0 = 1;
        } else if(a[i][l] < 0) {
            t[i][u].haf = 1; t[i][u].maxf = max(t[i][u].maxf, a[i][l]);
            t[i][u].minf = min(t[i][u].minf, a[i][l]);
        } else if(a[i][l] > 0) {
            t[i][u].haz = 1; t[i][u].maxz = max(t[i][u].maxz, a[i][l]);
            t[i][u].minz = min(t[i][u].minz, a[i][l]);
        }
        return ;
    }
    int mid = (l + r) >> 1;
    build(u << 1, l, mid, i);
    build(u << 1 | 1, mid + 1, r, i);
    t[i][u] = pushup(t[i][u << 1], t[i][u << 1 | 1]);
}

node query(int u, int l, int r, int x, int y, int i) {
    if(x <= l && r <= y) return t[i][u];
    int mid = (l + r) >> 1, flag = 0;
    node aans; 
    if(x <= mid) aans = query(u << 1, l, mid, x, y, i), flag = 1;
    if(y > mid) {
        node xx = query(u << 1 | 1, mid + 1, r, x, y, i);
        if(flag) aans = pushup(aans, xx);
        else aans = xx;
    }
    return aans;
}

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("%lld", &a[0][i]);
    for(int i = 1; i <= m; i++) scanf("%lld", &a[1][i]);
    build(1, 1, n, 0);
    build(1, 1, m, 1);
    //cout << t[1][1].maxz << endl;
    while(q--) {
        int l1, r1, l2, r2;
        scanf("%d%d%d%d", &l1, &r1, &l2, &r2);
        node A = query(1, 1, n, l1, r1, 0);
        node B = query(1, 1, m, l2, r2, 1);
        //LL maxa = max(A.maxz, A.maxf), mina = (A.minz, A.minf);
        //printf("=> %d %d %d %lld %lld %lld %lld\n", A.ha0, A.haz, A.haf, A.maxz, A.minz, A.maxf, A.minf);
		//printf("=> %d %d %d %lld %lld %lld %lld\n", B.ha0, B.haz, B.haf, B.maxz, B.minz, B.maxf, B.minf);
        LL ans;
        if(B.haz == 1 && B.haf == 0) {
            if(A.haz == 1) ans = A.maxz * B.minz;
            else ans = A.maxf * B.maxz;
        } else if(B.haz == 0 && B.haf == 1) {
            if(A.haf == 1) ans = A.minf * B.maxf;
            else ans = A.minz * B.minf;
        } else if(B.haz == 1 && B.haf == 1) {
            LL a1 = A.minz * B.minf;
            LL a2 = A.maxf * B.maxz;
            ans = max(a1, a2);
        }
        if(A.ha0 == 1 && ans < 0) ans = 0;
        if(B.ha0 == 1 && ans > 0) ans = 0;
        printf("%lld\n", ans);
    }
    return 0;
}
2022/11/11 16:22
加载中...