大暴力算法0分。。。(12样例已过)
查看原帖
大暴力算法0分。。。(12样例已过)
381510
yljx楼主2022/11/2 21:02
#include <bits/stdc++.h>
using namespace std;
int n,m,q;
int a[100010],b[100010];
int sum[100010][5];
int search1(int flag,int  way,int l,int r){
    int ans=0;
    if(!flag){
        if(way)ans=-1000000000;
    }else{
        if(!way)ans=1000000000;
    }
    for(int i=l;i<=r;i++){
        if(!flag){
            if(a[i]<0&&!way)ans=min(ans,a[i]);//最小负数
            if(a[i]<0&&way)ans=max(ans,a[i]);//最大负数
        }else{
            if(a[i]>0&&way)ans=max(ans,a[i]);//最大正数
            if(a[i]>0&&!way)ans=min(ans,a[i]);//最小正数
        }
    }
    return ans;
}
int search2(int flag,int way,int l,int r){
    int ans=0;
    if(!flag){
        if(way)ans=-1000000000;
    }else{
        if(!way)ans=1000000000;
    }
    for(int i=l;i<=r;i++){
        if(!flag){
            if(b[i]<0&&!way)ans=min(ans,b[i]);//最小负数
            if(b[i]<0&&way)ans=max(ans,b[i]);//最大负数
        }else{
            if(b[i]>0&&way)ans=max(ans,b[i]);//最大正数
            if(b[i]>0&&!way)ans=min(ans,b[i]);//最小正数
        }
    }
    return ans;
}
int main(){
    cin>>n>>m>>q;
    for(int i=1;i<=n;i++){
            sum[i][1]=sum[i-1][1];sum[i][2]=sum[i-1][2];
            cin>>a[i];
            if(!a[i])sum[i][1]=sum[i-1][1]+1;
            if(a[i]<0)sum[i][2]=sum[i-1][2]+1;
    }
    for(int i=1;i<=m;i++){
            sum[i][3]=sum[i-1][3];sum[i][4]=sum[i-1][4];
            cin>>b[i];
            if(!b[i])sum[i][3]=sum[i-1][3]+1;
            if(b[i]<0)sum[i][4]=sum[i-1][4]+1;
    }
    int l1,l2,r1,r2;
    int ct1[5],ct2[5],ans[q+1];
    for(int i=1;i<=q;i++){
        cin>>l1>>r1>>l2>>r2;
        ct1[1]=sum[r1][1]-sum[l1-1][1];ct1[2]=sum[r1][2]-sum[l1-1][2];
        ct2[1]=sum[r2][3]-sum[l2-1][3];ct2[2]=sum[r2][4]-sum[l2-1][4];
        if(ct2[1]==r2-l2+1||ct1[1]==r1-l1+1)ans[i]=0 ;//乙全0||甲全0都为0
        else if(ct2[1]&&ct2[2]&&ct2[1]+ct2[2]!=0){//乙+-0
            if(ct1[1]&&ct1[2]&&ct1[1]+ct1[2]!=0)ans[i]=0 ;
            else if(ct1[1]&&!ct1[2])ans[i]=0 ;
            else if(ct1[1]&&ct1[2])ans[i]=0 ;
            else if(ct1[2]&&!ct1[1])ans[i]=min(search1(1,0,l1,r1)*search2(0,1,l2,r2),search1(0,0,l1,r1)*search2(1,1,l2,r2)) ;
            else if(!ct1[1]&&!ct1[2])ans[i]=search1(1,0,l1,r1)*search2(0,1,l2,r2) ;
        }
        else{
            if(ct2[2]==r2-l2+1){//乙全负
                if(ct1[1]&&ct1[2]&&ct1[1]+ct1[2]!=0)ans[i]=search1(0,0,l1,r1)*search2(0,1,l2,r2) ;
                else if(ct1[2]==r1-l1+1)ans[i]=search1(0,1,l1,r1)*search2(0,0,l2,r2) ;
                else if(!ct1[1]&&!ct1[2])ans[i]=search1(1,0,l1,r1)*search2(0,1,l2,r2) ;
                else if(ct1[1]&&ct1[2])ans[i]=0 ;
                else if(!ct1[1])ans[i]=search1(0,1,l1,r1)*search2(0,1,l2,r2) ;
                else if(!ct1[2])ans[i]=0 ;

            }else if(!ct2[1]&&!ct2[2]){//乙全正
                    if(ct1[1]+ct1[2]!=r1-l1+1&&ct1[1]&&ct1[2])ans[i]=search1(1,1,l1,r1)*search2(1,0,l2,r2) ;//甲有正
                    else if(ct1[1]&&ct1[2])ans[i]=0 ; //甲 0+负 0
                    else if(!ct1[1]&&!ct1[2])ans[i]=search1(1,1,l1,r1)*search2(1,0,l2,r2) ;//maxz*minz
                    else if(ct1[2]){
                        if(ct1[2]==r1-l1+1)ans[i]=search1(0,0,l1,r1)*search2(1,1,l2,r2) ;//minfmaxz
                        else if(!ct1[2]&&ct1[1]&&ct1[1]!=r1-l1+1)ans[i]=search1(1,1,l1,r1)*search2(1,0,l2,r2) ;
                        else ans[i]=search1(1,1,l1,r1)*search2(1,0,l2,r2) ;//maxzminf
                    }
            }else if(ct2[1]&&ct2[2]==0&&ct2[1]!=r2-l2+1){//乙正0
                if(ct1[2]==r1-l1+1)ans[i]=search1(0,0,l1,r1)*search2(1,1,l2,r2) ;
                else ans[i]=0 ;
            }else if(ct2[1]&&ct2[2]&&ct2[1]+ct2[2]==r2-l2+1){//乙5
                if(!ct1[1]&&!ct1[2])ans[i]=search1(1,0,l1,r1)*search2(0,1,l2,r2) ;
                else ans[i]=0 ;
            }else if(!ct2[1]&&ct2[2]&&ct2[2]!=r2-l2+1){//6
                if(!ct1[1]&&!ct1[2])ans[i]=search1(1,0,l1,r1)*search2(0,1,l2,r2) ;
                else if(ct1[2]==r1-l1+1)ans[i]=search1(0,0,l1,r1)*search2(1,1,l2,r2) ;
                else if(!ct1[1]&&ct1[2]!=r1-l1+1)ans[i]=max(search1(1,0,l1,r1)*search2(0,0,l2,r2),search1(0,1,l1,r1)*search2(1,1,l2,r2)) ;
                else ans[i]=0 ;
            }
        }
    }
    for(int i=1;i<=q;i++)cout<<ans[i]<<endl;
    return 0;
}

2022/11/2 21:02
加载中...