从后往前执行操作,过程如下:
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;
}