csp-s T2代码求助!95pts
  • 板块学术版
  • 楼主SZbr
  • 当前回复2
  • 已保存回复2
  • 发布时间2022/10/30 15:34
  • 上次更新2023/10/27 04:51:45
查看原帖
csp-s T2代码求助!95pts
230738
SZbr楼主2022/10/30 15:34

开了几个st表贪心求的,感觉没有问题但是洛谷上WA了一个点

#include<bits/stdc++.h>
using namespace std;
#define int long long
const int inf=0x3f3f3f3f;
void read(int &ret){
    int res=0ll,fs=1ll;
    char a=getchar();
    while(a<'0'||a>'9'){
        if(a=='-'){
            fs*=-1ll;
        }
        a=getchar();
    }
    while(a>='0'&&a<='9'){
        res*=10ll;res+=(int)(a-'0');
        a=getchar();
    }
    ret=res*fs;
}
void Max(int &a,int b){
    if(a<b) a=b;
}
const int N=1e5+7;
int n,m,q;
int a[N],b[N],logt[N];
void pre_log(){
    logt[1]=0;
    for(int i=2;i<=n;++i){
        logt[i]=logt[i/2]+1;
    }
}
struct yzh{
    int st[2][22][N];
    void pre_st(int ed){
        for(int i=1;i<=20;++i){
            for(int j=1;j+(1<<i)-1<=ed;++j){
                st[0][i][j]=min(st[0][i-1][j],st[0][i-1][j+(1<<(i-1))]);
                st[1][i][j]=max(st[1][i-1][j],st[1][i-1][j+(1<<(i-1))]);
            }
        }
    }
}af,az,tb;
int qz[N];
signed main(){
    // freopen("game.in","r",stdin);
    // freopen("game.out","w",stdout);
    read(n);read(m);read(q);
    for(int i=1;i<=n;++i){
        read(a[i]);
        if(a[i]<0){
            af.st[0][0][i]=af.st[1][0][i]=a[i];
            az.st[0][0][i]=inf;
        }
        else{
            az.st[0][0][i]=az.st[1][0][i]=a[i];
            af.st[1][0][i]=-inf;
            qz[i]++;
        }
        qz[i]+=qz[i-1];
    }
    for(int i=1;i<=m;++i){
        read(b[i]);tb.st[0][0][i]=tb.st[1][0][i]=b[i];
    }
    pre_log();
    tb.pre_st(m);af.pre_st(n);az.pre_st(n);
    while(q--){
        int l1,r1,l2,r2;
        read(l1);read(r1);read(l2);read(r2);
        int lg1=logt[r1-l1+1],lg2=logt[r2-l2+1];
        int minb=min(tb.st[0][lg2][l2],tb.st[0][lg2][r2-(1<<lg2)+1]);
        int maxb=max(tb.st[1][lg2][l2],tb.st[1][lg2][r2-(1<<lg2)+1]);
        int maxn;
        bool flag=true;
        if(qz[r1]-qz[l1-1]){
            maxn=max(az.st[1][lg1][l1],az.st[1][lg1][r1-(1<<lg1)+1])*minb;
            Max(maxn,min(az.st[0][lg1][l1],az.st[0][lg1][r1-(1<<lg1)+1])*minb);
            flag=false;
        }
        // cout<<":::"<<max(az.st[1][lg1][l1],az.st[1][lg1][r1-(1<<lg1)+1])<<endl;
        if(qz[r1]-qz[l1-1]<(r1-l1+1)){
            if(flag) maxn=min(af.st[0][lg1][l1],af.st[0][lg1][r1-(1<<lg1)+1])*maxb;
            Max(maxn,min(af.st[0][lg1][l1],af.st[0][lg1][r1-(1<<lg1)+1])*maxb);
            Max(maxn,max(af.st[1][lg1][l1],af.st[1][lg1][r1-(1<<lg1)+1])*maxb);
        }
        // cout<<minb<<" "<<maxb<<endl;
        printf("%lld\n",maxn);
    }
    return 0;
}
2022/10/30 15:34
加载中...