0pts 求调!
查看原帖
0pts 求调!
516894
skkkkkkkkkk楼主2024/10/18 19:20
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
const int INF=0x3f3f3f3f;
int n,m,q;
int a[N],b[N],ta1[N],ta2[N];
int STa1[N][50],STa2[N][50],mSTa1[N][50],mSTa2[N][50],STb1[N][50],STb2[N][50];//a正数最大值、a非负最小值、a负数最大值、a最小值、b最大值、b最小值
void creat_max_ST(int t[],int ST[][50],int p){
    for(int i=1;i<=p;i++){
        ST[i][0]=t[i];
    }
    for(int i=1;i<=log(p);i++){
        for(int j=1;j+(1<<i)-1<=p;j++){
            ST[j][i]=max(ST[j][i-1],ST[j+(1<<i-1)][i-1]);
        }
    }
}
void creat_min_ST(int t[],int ST[][50],int p){
    for(int i=1;i<=p;i++){
        ST[i][0]=t[i];
    }
    for(int i=1;i<=log(p);i++){
        for(int j=1;j+(1<<i)-1<=p;j++){
            ST[j][i]=min(ST[j][i-1],ST[j+(1<<i-1)][i-1]);
        }
    }
}
int query_max(int ST[][50], int l,int r){
    if(r-l==0)return ST[l][0];
    int tmp=0;
    int mi=log(r-l);
    while(tmp<=mi)tmp++;
    tmp-=1;
    return max(ST[l][tmp],ST[r-(1<<tmp)+1][tmp]);
}
int query_min(int ST[][50], int l,int r){
    if(r-l==0)return ST[l][0];
    int tmp=0;
    int mi=log(r-l);
    while(tmp<=mi)tmp++;
    tmp-=1;
    return min(ST[l][tmp],ST[r-(1<<tmp)+1][tmp]);
}
int main(){
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        ta1[i]=a[i];
        ta2[i]=a[i];
        if(ta1[i]<0){
            ta1[i]=INF;
        }
        if(ta2[i]>0){
            ta2[i]=-INF;
        }
    }
    for(int i=1;i<=m;i++){
        cin>>b[i];
    }
    creat_max_ST(a,STa1,n);
    creat_min_ST(ta1,STa2,n);
    creat_max_ST(ta2,mSTa1,n);
    creat_min_ST(a,mSTa2,n);
    creat_max_ST(b,STb1,m);
    creat_min_ST(b,STb2,m);
    for(int i=1;i<=q;i++){
        int l1,r1,l2,r2;
        cin>>l1>>r1>>l2>>r2;
        //a>=0
        int ans=0;
        int y=query_min(STb2,l2,r2),x;
        if(y>=0){
            x=query_max(STa1,l1,r1);
        }else{
            x=query_min(STa2,l1,r1);
        }
        if(x<0)ans=0;
        else ans=x*y;
        // cout<<x<<' '<<y<<endl;
        // cout<<ans<<endl;
        
        //a<0
        y=query_max(STb1,l2,r2);
        if(y>=0){
            x=query_max(mSTa1,l1,r1);   
        }else{
            x=query_min(mSTa2,l1,r1);
        }
        // cout<<x<<' '<<y<<endl;
        if(x<0)ans=max(ans,x*y);
        cout<<ans<<endl;
    }
    return 0;
}
2024/10/18 19:20
加载中...