这道题的话,首先上来读题,发现它是不能采用对每个序号采用累加的方式来判断移动多少的,因为不同序号的移动之间是会相互影响的,就像题例中的三号和八号相互影响了一样,导致三号虽然正二负二,但是并不在原来的位置上。
本题采用的是stl库中的list这个双向链表的数据结构,该数据结构的插入和删除效率高,主要是利用它的splice函数,以及advance函数.
include<bits/stdc++.h>
using namespace std;
int main(){
list
int n, m, i, p, q;
cin >> n >> m;
for(i = 1; i <= n; i++){
lt.push_back(i);
}
for(i = 0; i < m; i++){
cin >> p >> q;
auto move = find(lt.begin(), lt.end(), p);
if (move != lt.end()) {
if(q > 0) {
auto target = move;
advance(target, q);
if(target != lt.end()) {
lt.splice(next(target), lt, move);
} else {
lt.splice(lt.end(), lt, move);
}
} else if(q < 0) {
auto target = move;
advance(target, q);
if(target != lt.begin()) {
lt.splice(target, lt, move);
} else {
lt.splice(lt.begin(), lt, move);
}
}
}
}
for (auto elem : lt) {
cout << elem << ' ';
}
cout << '\n';
return 0;
}