题解:P13524 [KOI 2025 #2] 跳跃

· · 题解

P13524 跳跃 题解

分析

  1. 子任务 2
    for(int i=1;i<=n;++i) p[i]=i;
    for(int i=1;i<n;++i)
        if(a[i]==3) swap(p[i],p[i+1]);
    for(int i=1;i<=n;++i) cout<<p[i]<<' ';
  2. 映射实现
    int main()
    {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);cout.tie(nullptr);
    //  freopen("paper.in","r",stdin);
    //  freopen("paper.out","w",stdout);
    cin>>n;
    bool flag=true;
    for(int i=1;i<n;++i){
        cin>>a[i];
        if(a[i]!=1) flag=false;
    }
    if(flag){
        for(int i=1;i<=n;++i) cout<<i<<' ';
        return 0;
    }
    int cnt=0;
    for(int i=2;i<n;++i){
        if(a[i]-a[i-1]==2){
            p[++cnt]=i;
        }
        if(a[i]-a[i-1]==-2){
            nxt[p[cnt]]=i;
            nxt[i]=p[cnt];
            --cnt;
        }
    }
    cout<<"1 ";
    for(int i=1;i<n;++i){
        if(a[i]-a[i-1]==2) cout<<nxt[i]<<' '<<i<<' ';
        if(a[i]-a[i-1]==0) cout<<i<<' ';
    }
    cout<<n<<' ';
    return 0;
    }

    ::::info[注意事项] 注意首尾固定,可以单独输出,c_i-c_{i-1}=2c_i-c_{i-1}=-2 的情况选择一种输出即可(c_i-c_{i-1}=-2 时先输出 i 再输出 nxt_i)。 ::::

时间复杂度 O(n)