从后往前执行操作,过程如下:
1 2 3 4 5
1 3 2 4 5
1 3 4 2 5
1 4 3 2 5
4 1 3 2 5
执行4个操作后,4到达1,逆向操作后,4回到4,所以只需要知道在这个位置的是什么,就可以知道这个位置的数字执行后续操作后会到达哪里。

#include <bits/stdc++.h>
#define N 200050
using namespace std;
int n, m, i, j, k, s[N], a[N], p[N], u[N];
int main(){
    scanf("%d%d", &n, &m);
    for(i=k=1; i<=m; i++){
        scanf("%d", &s[i]);
        a[i] = i;
    }
    for(p[1]=i=1; j=s[i]; i++){
        u[i] = p[1];//预处理前i-1个操作后1在哪里
        swap(a[j], a[j+1]);
        p[a[j]] = j, p[a[j+1]] = j+1;
    }
    for(i=1; i<=n; i++) p[i] = i;//初始化
    for(i=m; j=s[i]; i--){
        a[i] = p[u[i]];
        swap(p[j], p[j+1]);//后面操作执行后,p[i]到达i
    }//逆向操作即可知i回到p[i],所以答案是p[u[i]]
    for(i=1; i<=m; i++){
        printf("%d\n", a[i]);
    }
    return 0;
}

作者 crxis

发表回复