40分玄关求调 orz
查看原帖
40分玄关求调 orz
984202
Qinkaixi666楼主2024/10/29 21:37
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cstdio>
#include<queue>
#include<set>
#include<vector>
#define int long long
#define ls t*2
#define rs t*2+1
using namespace std;
const int N = 100019,M=1e24;
int mx(int i,int j){return (i>j)?i:j;}
int mn(int i,int j){return (i<j)?i:j;}
int n,m,ay[N],by[N],qu;
struct node{int mx,mn,mxf,mnz;}a[N*4],b[N*4];
inline int read(){
    int f=1,ss=0;char c=getchar();
    while(c<'0'||c>'9'){if(c=='-') f=-1;c=getchar();}
    while(c>='0'&&c<='9'){ss=ss*10+c-'0';c=getchar();}
    return ss*f;
}
void pushup(int t,node c[]){
    c[t].mx=mx(c[ls].mx,c[rs].mx);c[t].mn=mn(c[ls].mn,c[rs].mn);
    c[t].mnz=mn(c[ls].mnz,c[rs].mnz);
    c[t].mxf=mx(c[ls].mxf,c[rs].mxf);
}
void build(int t,int l,int r,int c[],node p[]){
    if(l==r) {
        p[t].mx=p[t].mn=c[l];
        p[t].mnz=(c[l]>=0)?c[l]:M;
        p[t].mxf=(c[l]<=0)?c[l]:-M;
        return ;
    }
    int mid=(l+r)>>1;
    build(ls,l,mid,c,p);build(rs,mid+1,r,c,p);
    pushup(t,p);
}
node query(int t,int tl,int tr,int l,int r,node c[]){
    if(l<=tl&&tr<=r) {return c[t];}
    int mid=(tl+tr)>>1;
    int mxx=-M,mnn=M,mxxf=-M,mnnz=M;
    if(l<=mid) {
        node T=query(ls,tl,mid,l,r,c);
        mxx=mx(T.mx,mxx);mnn=mn(T.mn,mnn);
        mxxf=mx(T.mxf,mxxf);mnnz=mn(T.mnz,mnnz);
    }
    if(r>mid) {
        node T=query(rs,mid+1,tr,l,r,c);
        mxx=mx(T.mx,mxx);mnn=mn(T.mn,mnn);
        mxxf=mx(T.mxf,mxxf);mnnz=mn(T.mnz,mnnz);
    }
    return (node){mxx,mnn,mxxf,mnnz};
}
signed main(){
    //freopen("CSP-S 2022.in","r",stdin);
    //freopen("CSP-S 2022.out","w",stdout);
    n=read();m=read();qu=read();
    for(int i=1;i<=n;i++) ay[i]=read();
    for(int i=1;i<=m;i++) by[i]=read();
    build(1,1,n,ay,a);build(1,1,m,by,b);
    int l1,r1,l2,r2;
    while(qu--){
        l1=read();r1=read();l2=read();r2=read();
        int ans=M;
        node ansa=query(1,1,n,l1,r1,a),ansb=query(1,1,m,l2,r2,b);
        if(ansb.mx<=0) {if(ansa.mn<0) ans=ansa.mn*ansb.mx;else ans=ansa.mn*ansb.mx;}
        else if(ansb.mn>=0)
        {if(ansa.mx<0) ans=ansa.mx*ansb.mx;else ans=ansa.mx*ansb.mn;}
        else {
            ans=-M;
            if(ansa.mx>=0) ans=mx(ans,ansa.mnz*ansb.mn);
            if(ansa.mn<=0) ans=mx(ans,ansa.mxf*ansb.mx);
            if(ansa.mnz==0) ans=0;
        }
        printf("%lld\n",ans);
    }
    return 0;
}



2024/10/29 21:37
加载中...