P11463 题解
copper_ingot · · 题解
题目传送门
首先传球
然后观察数据范围,发现
想到要用一个可以
我们建一个双向链表,维护
每次先判断方向,如果这次传球是向右传的,就把
最后从头输出每个元素即可。
代码:
#include <bits/stdc++.h>
using namespace std;
#define int long long
int t, n, x, k, pre[200001], nex[200001], mid, head, tail;
signed main(){
scanf("%lld", &t);
while (t--){
scanf("%lld%lld%lld", &n, &x, &k); k %= n * 2;
for (int i = 2; i < n; i++) pre[i] = i - 1, nex[i] = i + 1;
pre[1] = -1, nex[1] = 2, head = 1;
pre[n] = n - 1, nex[n] = -1, tail = n;
mid = (n + 1) / 2;
for (int i = 1; i <= k; i++){
if (i % 2 == x){
nex[pre[mid]] = nex[mid], pre[nex[mid]] = pre[mid];
nex[tail] = mid, pre[mid] = tail;
tail = mid; mid = nex[mid];
nex[tail] = -1;
}
else{
nex[pre[mid]] = nex[mid], pre[nex[mid]] = pre[mid];
pre[head] = mid, nex[mid] = head;
head = mid; mid = pre[mid];
pre[head] = -1;
}
}
int tmp = head;
while (tmp != -1){printf("%lld ", tmp); tmp = nex[tmp];}
puts("");
}
return 0;
}