#include <iostream>
#include <vector> //引入向量库,用于存储和操作动态数组
using namespace std;
int main()
{
int n, q;
cin >> n >> q;
int i;
vector<int>num(n + 1), pos(n + 1);//定义两个长度为n+1的初始向量
//其中,num用来存储向量的实际编号,而pos用来存储向量的实际位置
for (i = 1; i <= n; ++i) {
num[i] = i;//初始时,小球的编号依次为1~n
pos[i] = i;//初始时,小球的位置依次为1~n
}
while (q--) { //循环操作q次
int x;
cin >> x;//逐个输入需要操作的小球的编号
if (pos[x] != n) {//当需要操作的小球的位置不是最右侧时
int now = pos[x];//定义一个now表示小球现在的位置
int next = pos[x] + 1;//定义一个next表示小球右侧的“位置”
swap(pos[x], pos[num[next]]);//交换小球现在的位置和右侧球的位置
//注意:1.这里不是swap(pos[x],pos[next]) 2,是pos[x],不是pos[now]
//原因:1,next是球的位置,而不是编号,我们在这里需要交换编号对应的位置的小球 2,同1
swap(num[now], num[next]);//交换小球现在的编号和右侧的编号
}
else {//当需要操作的小球的位置是最右侧时
int now = pos[x];
int pre = pos[x] - 1;//定义一个pre代表左侧的小球的“位置”
swap(pos[x], pos[num[pre]]);//同上if
swap(num[now], num[pre]);//同上一个if
}
}
//循环输出最后的排列情况
for (i = 1; i <= n; ++i) cout << num[i] << " ";
return 0;
}
这道题真的很多坑点~~心累