求助 这能RE?
  • 板块CF13E Holes
  • 楼主zhangzhihao2卷王
  • 当前回复3
  • 已保存回复3
  • 发布时间2024/7/16 21:22
  • 上次更新2024/7/16 22:46:14
查看原帖
求助 这能RE?
685325
zhangzhihao2卷王楼主2024/7/16 21:22

RE on #14,弹飞绵羊过了,这边RE了,尝试关了O2也没用,还特地把数组开得贼大,但实在想不出哪里会越界了(

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,m,B,nex[1000009],k[1000009],step[1000009];

bool sam(int a,int b){
    return (a-1)/B==(b-1)/B;
}
int opt,x,y;
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>k[i];
    B=ceil(sqrt(n));
    for(int i=n;i;i--){
        if(sam(i,i+k[i])&&i+k[i]<=n) step[i]=step[i+k[i]]+1,nex[i]=nex[i+k[i]];
        else nex[i]=i;
    }
    for(int i=1;i<=m;i++){
        scanf("%lld",&opt);
        if(opt==0){
            scanf("%lld%lld",&x,&y);
            k[x]=y;
            if(sam(x,x+k[x])&&x+k[x]<=n) step[x]=step[x+k[x]]+1,nex[x]=nex[x+k[x]];
            else nex[x]=x,step[x]=0;
            for(int j=x-1;sam(x,j);j--){
                if(step[j]&&j+k[j]<=n) step[j]=step[j+k[j]]+1,nex[j]=nex[j+k[j]]; 
            }
        }
        else{
            scanf("%lld",&x);
            int cnt=0;
            while(x<=n){
                cnt+=step[x]+1;
                x=nex[x];
                y=x;
                x=x+k[x];
            }
            printf("%lld %lld\n",y,cnt);
        }
    }
    return 0;
}
2024/7/16 21:22
加载中...