维护六个变量好像可以?
查看原帖
维护六个变量好像可以?
515129
TLEWA楼主2022/10/29 21:51
#include<bits/stdc++.h>
//#define int long long
using namespace std;

int n,m,q;
int arr1[100050],arr2[100050];

struct Node {
    int l,r;
    //  big  small  bbig smmal
    int maxn=-1500000000,minn=1500000000,mmaxn=1500000000,mminn=-1500000000;
}tre1[400050],tre2[400050];

inline int ls(int n){return n<<1;}
inline int rs(int n){return (n<<1)+1;}

void build1(int p,int l,int r) {
    tre1[p].l=l;
    tre1[p].r=r;
    if(l==r) {
        tre1[p].maxn=tre1[p].minn=tre1[p].mmaxn=tre1[p].mminn=arr1[l];
        if(arr1[l]>0) tre1[p].mminn=-1500000000;
        if(arr1[l]<0) tre1[p].mmaxn=1500000000;
        return;
    }else {
        int mid=(l+r)/2;
        build1(ls(p),l,mid);
        build1(rs(p),mid+1,r);
        tre1[p].maxn=max(tre1[ls(p)].maxn,tre1[rs(p)].maxn);
        tre1[p].mminn=max(tre1[ls(p)].mminn,tre1[rs(p)].mminn);
        tre1[p].minn=min(tre1[ls(p)].minn,tre1[rs(p)].minn);
        tre1[p].mmaxn=min(tre1[ls(p)].mmaxn,tre1[rs(p)].mmaxn);
    }
}

void build2(int p,int l,int r) {
//    cout << l << ' ' << r << endl;
    tre2[p].l=l;
    tre2[p].r=r;
    if(l==r) {
        tre2[p].maxn=tre2[p].minn=tre2[p].mmaxn=tre2[p].mminn=arr2[l];
        if(arr2[l]>0) tre2[p].mminn=-1500000000;
        if(arr2[l]<0) tre2[p].mmaxn=1500000000;
        return;
    }else {
        int mid=(l+r)/2;
        build2(ls(p),l,mid);
        build2(rs(p),mid+1,r);
        tre2[p].maxn=max(tre2[ls(p)].maxn,tre2[rs(p)].maxn);
        tre2[p].mminn=max(tre2[ls(p)].mminn,tre2[rs(p)].mminn);
        tre2[p].minn=min(tre2[ls(p)].minn,tre2[rs(p)].minn);
        tre2[p].mmaxn=min(tre2[ls(p)].mmaxn,tre2[rs(p)].mmaxn);
    }
}

int maxn,minn,mmaxn,mminn;

void find1(int p,int l,int r) {
//    cout << l << ' ' << r << ' ' << tre1[p].l << ' ' << tre1[p].r << endl;
    if(tre1[p].l>=l&&tre1[p].r<=r) { //baohan
        maxn=max(maxn,tre1[p].maxn);
        mminn=max(mminn,tre1[p].mminn);
        minn=min(minn,tre1[p].minn);
        mmaxn=min(mmaxn,tre1[p].mmaxn);
    }else {
        int mid=(tre1[p].l+tre1[p].r)/2;
        if(l<=mid) find1(ls(p),l,r);
        if(r>=mid+1) find1(rs(p),l,r);
    }
}

void find2(int p,int l,int r) {
//    cout << l << ' ' << r << ' ' << tre2[p].l << ' ' << tre2[p].r << endl;
    if(tre2[p].l>=l&&tre2[p].r<=r) { //baohan
        maxn=max(maxn,tre2[p].maxn);
        mminn=max(mminn,tre2[p].mminn);
        minn=min(minn,tre2[p].minn);
        mmaxn=min(mmaxn,tre2[p].mmaxn);
    }else {
        int mid=(tre2[p].l+tre2[p].r)/2;
        if(l<=mid) find2(ls(p),l,r);
        if(r>=mid+1) find2(rs(p),l,r);
    }
}

int l1,l2,r1,r2;
long long m1,m2,mm1,mm2,p1,p2,pp1,pp2;

signed main() {
//    freopen("game.in","r",stdin);
//    freopen("game.out","w",stdout);

    cin >> n >> m >> q;
    for(int i=1;i<=n;++i) cin >> arr1[i];
    for(int i=1;i<=m;++i) cin >> arr2[i];

    build1(1,1,n);
    build2(1,1,m);

//    cout << tre1[1].l << ' ' << tre1[1].r << endl;

    for(int i=1;i<=q;++i) {
        cin >> l1 >> r1 >> l2 >> r2;
        maxn=-1500000000,minn=1500000000,mmaxn=1500000000,mminn=-1500000000;
        find1(1,l1,r1);
        m1=maxn,mm1=mmaxn,p1=minn,pp1=mminn;
        maxn=-1500000000,minn=1500000000,mmaxn=1500000000,mminn=-1500000000;
        find2(1,l2,r2);
        m2=maxn,mm2=mmaxn,p2=minn,pp2=mminn;
//        cout << m1 << ' ' << mm1 << ' ' << p1 << ' ' << pp1 << ' ' << m2 << ' ' << mm2 << ' ' << p2 << ' ' << pp2 << endl;
        if(pp2==-1500000000) {
            cout << m1*p2 << endl;
        }else if(m2<0) {
            cout << p1*m2 << endl;
        }else if(pp1==-1500000000){
            cout << p1*p2 << endl;
        }else if(m1<0){
            cout << pp1*m2 << endl;
        }else{
            cout << max(mm1*p2,pp1*m2) << endl;
        }
    }


//    fclose(stdin);
//    fclose(stdout);
    return 0;
}
2022/10/29 21:51
加载中...