CSP2022T1萌新WA40pts求调悬关
  • 板块灌水区
  • 楼主sundyLIUXY
  • 当前回复0
  • 已保存回复0
  • 发布时间2023/9/20 11:18
  • 上次更新2023/11/2 19:01:17
查看原帖
CSP2022T1萌新WA40pts求调悬关
706737
sundyLIUXY楼主2023/9/20 11:18
#include <bits/stdc++.h>
#define int long long
using namespace std;

const int INF = 8000000000000000000; 
int n, m, q, a[100010], b[100010], ans;
struct TREE {
    int l, r, mx;
} t1[400010], t2[400010], t3[400010], t4[400010];
TREE t5[400010], t6[400010];

void pushup1(int u) {
    t1[u].mx = max(t1[u<<1].mx, t1[u<<1|1].mx);
}
void pushup2(int u) {
    t2[u].mx = min(t2[u<<1].mx, t2[u<<1|1].mx);
}
void pushup3(int u) {
    t3[u].mx = max(t3[u<<1].mx, t3[u<<1|1].mx);
}
void pushup4(int u) {
    t4[u].mx = min(t4[u<<1].mx, t4[u<<1|1].mx);
}
void build1(int u, int l, int r) {
    if(l == r) {
        if(a[l] < 0) 
            t2[u] = {l, l, INF}, t3[u] = {l, l, a[l]};
        else t2[u] = {l, l, a[l]}, t3[u] = {l, l, -INF};
        t1[u] = t4[u] = {l, l, a[l]};
        return;
    }
    t1[u] = t2[u] = t3[u] = t4[u] = {l, r};
    int mid = (l+r)>>1;
    build1(u<<1, l, mid), build1(u<<1|1, mid+1, r);
    pushup1(u), pushup2(u), pushup3(u), pushup4(u);
}
void pushup5(int u) {
    t5[u].mx = max(t5[u<<1].mx, t5[u<<1|1].mx);
}
void pushup6(int u) {
    t6[u].mx = min(t6[u<<1].mx, t6[u<<1|1].mx);
}
void build2(int u, int l, int r) {
    if(l == r) {
        t5[u] = t6[u] = {l, l, b[l]};
        return;
    }
    t5[u] = t6[u] = {l, r};
    int mid = (l+r)>>1;
    build2(u<<1, l, mid), build2(u<<1|1, mid+1, r);
    pushup5(u), pushup6(u);
}
int query1(int u, int l, int r) {
    if(t1[u].l >= l && t1[u].r <= r) return t1[u].mx;
    int mid = (t1[u].l+t1[u].r)>>1, res = -INF;
    if(mid >= l) res = max(res, query1(u<<1, l, r));
    if(mid < r) res = max(res, query1(u<<1|1, l, r));
    return res;
}
int query2(int u, int l, int r) {
    if(t2[u].l >= l && t2[u].r <= r) return t2[u].mx;
    int mid = (t2[u].l+t2[u].r)>>1, res = INF;
    if(mid >= l) res = min(res, query2(u<<1, l, r));
    if(mid < r) res = min(res, query2(u<<1|1, l, r));
    return res;
}
int query3(int u, int l, int r) {
    if(t3[u].l >= l && t3[u].r <= r) return t3[u].mx;
    int mid = (t3[u].l+t3[u].r)>>1, res = -INF;
    if(mid >= l) res = max(res, query3(u<<1, l, mid));
    if(mid < r) res = max(res, query3(u<<1|1, mid+1, r));
    return res;
}
int query4(int u, int l, int r) {
    if(t4[u].l >= l && t4[u].r <= r) return t4[u].mx;
    int mid = (t4[u].l+t4[u].r)>>1, res = INF;
    if(mid >= l) res = min(res, query4(u<<1, l, r));
    if(mid < r) res = min(res, query4(u<<1|1, l, r));
    return res;
}
int query5(int u, int l, int r) {
    if(t5[u].l >= l && t5[u].r <= r) return t5[u].mx;
    int mid = (t5[u].l+t5[u].r)>>1, res = -INF;
    if(mid >= l) res = max(res, query5(u<<1, l, r));
    if(mid < r) res = max(res, query5(u<<1|1, l, r));
    return res;
}
int query6(int u, int l, int r) {
    if(t6[u].l >= l && t6[u].r <= r) return t6[u].mx;
    int mid = (t6[u].l+t6[u].r)>>1, res = INF;
    if(mid >= l) res = min(res, query6(u<<1, l, r));
    if(mid < r) res = min(res, query6(u<<1|1, l, r));
    return res;
}
signed main() {
    //freopen("game4.in", "r", stdin);
    scanf("%lld%lld%lld", &n, &m, &q);
    for(int i = 1; i <= n; i++) scanf("%lld", &a[i]);
    for(int i = 1; i <= m; i++) scanf("%lld", &b[i]);
    build1(1, 1, n), build2(1, 1, m);
    for(int i = 1; i <= q; i++) {
        int l1, l2, r1, r2;
        scanf("%lld%lld%lld%lld", &l1, &r1, &l2, &r2);
        int x = query5(1, l2, r2), y = query6(1, l2, r2);
        ans = -INF;
        ans = max(ans, query1(1, l1, r1)*(query1(1, l1, r1) > 0 ? y : x));
		if(query2(1, l1, r1) != INF) 
			ans = max(ans, query2(1, l1, r1)*(query2(1, l1, r1) > 0 ? y : x));
		if(query3(1, l1, r1) != -INF)
			ans = max(ans, query3(1, l1, r1)*(query3(1, l1, r1) > 0 ? y : x));
		ans = max(ans, query4(1, l1, r1)*(query4(1, l1, r1) > 0 ? y : x));
        printf("%lld\n", ans);
    }

    return 0;
}

2023/9/20 11:18
加载中...