心态崩了!分块甚至一分也不给?
查看原帖
心态崩了!分块甚至一分也不给?
748854
FunKingDoor楼主2022/10/30 20:48
#include <iostream>
#include <cstring>
#include <limits.h>
#include <cmath>
using namespace std;

#define int long long

const int MX = 2e5 + 5;

struct block{
    int minx = LLONG_MAX, maxx = LLONG_MIN, posx = LLONG_MAX, negx = LLONG_MIN;
    int Size;
    void cmp(const block t) {
        minx = min(minx, t.minx);
        maxx = max(maxx, t.maxx);
        posx = min(posx, t.posx);
        negx = max(negx, t.negx);
    }
    void cmp(const int t){
        minx = min(minx, t);
        maxx = max(maxx, t);
        if(t >= 0) posx = min(posx, t);
        if(t <= 0) negx = max(negx, t);
    }
};

int a[MX], b[MX], n, m, q;
block abl[MX / 500], bbl[MX / 500];
int amta, amtb, siza, sizb;
int bela[MX], belb[MX];

block querya(int l, int r){
    block ans;
    for(int i = (l % siza == 1 ? bela[l] : bela[l] + 1); i <= (r % siza == 0 ? bela[r] : bela[r] - 1); i++) ans.cmp(abl[i]);
    if(l % siza != 1) {
        int lst = siza * bela[l];
        for(int i = l; i <= lst; i++) ans.cmp(a[i]);
    }
    if(r % siza){
        int fst = siza * bela[r] - siza + 1;
        for(int i = fst; i <= r; i++) ans.cmp(a[i]);
    }
    return ans;
}

block queryb(int l, int r){
    block ans;
    for(int i = (l % sizb == 1 ? belb[l] : belb[l] + 1); i <= (r % sizb == 0 ? belb[r] : belb[r] - 1); i++) ans.cmp(bbl[i]);
    if(l % sizb != 1) {
        int lst = sizb * belb[l];
        for(int i = l; i <= lst; i++) ans.cmp(b[i]);
    }
    if(r % sizb){
        int fst = sizb * belb[r] - sizb + 1;
        for(int i = fst; i <= r; i++) ans.cmp(b[i]);
    }
    return ans;
}

signed main(){
//  freopen("game.in", "r", stdin);
//  freopen("game.out", "w", stdout);
    cin >> n >> m >> q;
    for(int i = 1; i <= n; i++)
        cin >> a[i];
    for(int i = 1; i <= m; i++)
        cin >> b[i];
    siza = floor(sqrtl(n));
    sizb = floor(sqrtl(m));
    amta = n / siza + (n % siza ? 1 : 0);
    amtb = m / sizb + (m % sizb ? 1 : 0);
    for(int i = 1; i <= amta; i++){
        abl[i].Size = (i < amta ? siza : n - (amta - 1) * siza);
        for(int j = 1; j <= abl[i].Size; j++){
            int tmp = (i - 1) * siza + j;
            bela[tmp] = i;
            abl[i].minx = min(abl[i].minx, a[tmp]);
            abl[i].maxx = max(abl[i].maxx, a[tmp]);
            if(a[tmp] >= 0) abl[i].posx = min(abl[i].posx, a[tmp]);
            if(a[tmp] <= 0) abl[i].negx = max(abl[i].negx, a[tmp]);
        }
    }
    for(int i = 1; i <= amtb; i++){
        bbl[i].Size = (i < amtb ? sizb : m - (amtb - 1) * sizb);
        for(int j = 1; j <= sizb; j++){
            int tmp = (i - 1) * sizb + j;
            belb[tmp] = i;
            bbl[i].minx = min(bbl[i].minx, b[tmp]);
            bbl[i].maxx = max(bbl[i].maxx, b[tmp]);
            if(b[tmp] >= 0) bbl[i].posx = min(bbl[i].posx, b[tmp]);
            if(b[tmp] <= 0) bbl[i].negx = max(bbl[i].negx, b[tmp]);
        }
    }
    while(q--){
        int l1, r1, l2, r2;
        cin >> l1 >> r1 >> l2 >> r2;
        block ansa = querya(l1, r1);
        block ansb = queryb(l2, r2);
        if(ansb.maxx <= 0) cout << ansa.minx * ansb.maxx << endl;
        else if(ansb.minx >= 0) cout << ansa.maxx * ansb.minx << endl;
        else {
            int ans1 = ansb.minx * ansa.posx;
            int ans2 = ansb.maxx * ansa.negx;
            cout << max(ans1, ans2) << endl;
        }
    }
    return 0;
}

2022/10/30 20:48
加载中...