玄学全部RE11求助
查看原帖
玄学全部RE11求助
229008
yshpdyt楼主2023/7/31 22:18
#include<bits/stdc++.h>
#define ll long long
using namespace std;
int xma0[114514][30],xma1[114514][30],xmi0[114514][30],xmi1[114514][30];
// 0>=0,1<0;
int yma[114514][30],ymi[114514][30];
int n,m,q,gn[30],gm[30];
int main(){
    cin>>n>>m>>q;
    memset(xma0,0xcf,sizeof(xma0));
    memset(xma1,0xcf,sizeof(xma1));
    memset(xmi0,0x3f,sizeof(xmi0));
    memset(xmi1,0x3f,sizeof(xmi1));
    memset(yma,0xcf,sizeof(yma));
    memset(ymi,0x3f,sizeof(ymi));
    gn[1]=gm[1]=0;
    for(int i=2;i<=n;i++)gn[i]=gn[i>>1]+1;
    for(int i=2;i<=m;i++)gm[i]=gm[i>>1]+1;
    for(int i=1;i<=n;i++){
        int x;
        cin>>x;
        xma0[i][0]=xmi1[i][0]=x;
        if(x<0)xma1[i][0]=x;
        if(x>=0)xmi0[i][0]=x;
    }
    for(int i=1;i<=m;i++){
        int y;
        cin>>y;
        yma[i][0]=ymi[i][0]=y;
    }
    for(int j=1;j<=gn[n];j++){
        for(int i=1;i<=n-(1<<j)+1;i++){
            xma0[i][j]=max(xma0[i][j-1],xma0[i+(1<<(j-1))][j-1]);
            xma1[i][j]=max(xma1[i][j-1],xma1[i+(1<<(j-1))][j-1]);
            xmi0[i][j]=min(xmi0[i][j-1],xmi0[i+(1<<(j-1))][j-1]);
            xmi1[i][j]=min(xmi1[i][j-1],xmi1[i+(1<<(j-1))][j-1]);
        }
    }
    for(int j=1;j<=gm[m];j++){
        for(int i=1;i<=m-(1<<j)+1;i++){
            yma[i][j]=max(yma[i][j-1],yma[i+(1<<(j-1))][j-1]);
            ymi[i][j]=min(ymi[i][j-1],ymi[i+(1<<(j-1))][j-1]);
        }
    }
    while(q--){
        ll l1,r1,l2,r2,s1,s2;
        ll xmax0,xmax1,xmin0,xmin1;
        ll ymax,ymin;
        ll ans=INT_MIN;
        cin>>l1>>r1>>l2>>r2;
        s1=r1-l1+1;
        s2=r2-l2+1;
        ll t=r1-(1<<gn[s1])+1;
        xmax0=max(xma0[l1][gn[s1]],xma0[t][gn[s1]]);//>=0 max
        xmax1=max(xma1[l1][gn[s1]],xma1[t][gn[s1]]);//<0 max
        xmin0=min(xmi0[l1][gn[s1]],xmi0[t][gn[s1]]);//>=0 min
        xmin1=min(xmi1[l1][gn[s1]],xmi1[t][gn[s1]]);//<0 min;
       
        ymax=max(yma[l2][gm[s2]],yma[r2-(1<<gm[s2])+1][gm[s2]]);
        ymin=min(ymi[l2][gm[s2]],ymi[r2-(1<<gm[s2])+1][gm[s2]]);
        //cout<<xmax0<<" "<<xmax1<<" "<<xmin0<<" "<<xmin1<<endl;
        //cout<<ymax<<" "<<ymin<<endl;
        xmin1=min(xmin1,xmin0);
        xmax0=max(xmax0,xmax1);
        ans=max(ans,xmax0*(xmax0>=0?ymin:ymax));
        ans=max(ans,xmin1*(xmin1>=0?ymin:ymax));
        if(xmax1>INT_MIN){
            ans=max(ans,xmax1*ymax);
        }
        if(xmin0<INT_MAX){
            ans=max(ans,xmin0*ymin);
        }
        cout<<ans<<endl;
    }
    return 0;
}

太菜了

2023/7/31 22:18
加载中...