WA#19,求调错
  • 板块CF1707E Replace
  • 楼主hmya
  • 当前回复1
  • 已保存回复1
  • 发布时间2022/10/8 17:13
  • 上次更新2023/10/27 08:11:03
查看原帖
WA#19,求调错
264490
hmya楼主2022/10/8 17:13
#include<bits/stdc++.h>
using namespace std;
int n,q;
int ST1[100005][25][25];
int ST2[100005][25][25];
int power[25];
int lg[100005];
int getMin(int lt,int rt,int k){
    int len=rt-lt+1;
    return min(ST2[lt][lg[len]][k],ST2[rt-power[lg[len]]+1][lg[len]][k]);
}
int getMax(int lt,int rt,int k){
    int len=rt-lt+1;
    return max(ST1[lt][lg[len]][k],ST1[rt-power[lg[len]]+1][lg[len]][k]);
}
signed main(){
    power[0]=1;
    lg[0]=-1;
    for(int i=1;i<=100000;i++){
        lg[i]=lg[i/2]+1;
    }
    for(int i=1;i<=20;i++){
        power[i]=power[i-1]*2;
    }
    scanf("%d",&n);
    scanf("%d",&q);
    for(int i=1;i<=n;i++){
        scanf("%d",&ST1[i][0][0]);
        ST2[i][0][0]=ST1[i][0][0];
    }
    for(int j=1;j<=lg[n];j++){
        for(int i=1;i+power[j]-1<=n;i++){
            ST1[i][j][0]=max(ST1[i][j-1][0],ST1[i+power[j-1]][j-1][0]);
            ST2[i][j][0]=min(ST2[i][j-1][0],ST2[i+power[j-1]][j-1][0]);
        }
    }
    for(int k=1;k<=lg[n];k++){
        for(int j=1;j<=lg[n];j++){
            for(int i=1;i+power[j]-1<=n;i++){
                ST1[i][j][k]=getMax(ST2[i][j][k-1],ST1[i][j][k-1],k-1);
                ST2[i][j][k]=getMin(ST2[i][j][k-1],ST1[i][j][k-1],k-1);
            }
        }
    }
    while(q--){
        int lt,rt;
        scanf("%d%d",&lt,&rt);
        if(lt==1&&rt==n){
            puts("0");
            continue;
        }
        int ans=0;
        for(int i=lg[n];i>=0;i--){
            int tmp1=getMin(lt,rt,i);
            int tmp2=getMax(lt,rt,i);
            if(tmp1!=1||tmp2!=n){
                lt=tmp1,rt=tmp2;
                ans+=1<<i;
            }
        }
        int tmp1=getMin(lt,rt,0);
        int tmp2=getMax(lt,rt,0);
        if(tmp1!=1||tmp2!=n){
            puts("-1");
        }
        else{
            printf("%d\n",ans+1);
        }
    }
    return 0;
}

无解情况判错了,但是完全看不出来哪里错了

2022/10/8 17:13
加载中...