题目链接:http://acm.nyist.net/JudgeOnline/problem.php?pid=511
解题思路:
先预处理一下左右数组,使他们满足初始时候的左右邻居。
然后模拟移动即可。
这里需要注意的就是移动时改变左右邻居时,要防止覆盖问题。就是我更改某个邻居后,不能在以后的修改中影响这个值,所以顺序需要注意。
在这里错了,找了半个小时。悲剧。
代码如下:
#include<iostream>
#include<cstring>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
int l[10010], r[10010];
int main()
{
int ncase;
scanf("%d", &ncase);
while(ncase--)
{
int num, query;
char ope;
int x, y;
scanf("%d %d", &num, &query);
for(int i = 1; i <= num; ++i) //预处理
{
r[i] = ((i + 1) <= num ? (i + 1) : (i + 1) % num);
l[i] = ((i - 1) == 0 ? num : (i - 1));
}
for(int i = 0; i < query; ++i)
{
getchar();
scanf("%c %d %d", &ope, &x, &y);
if(ope == 'A')
{
r[l[x]] = r[x]; l[r[x]] = l[x];
l[x] = l[y]; r[x] = y;
r[l[y]] = x; l[y] = x;
}
else if(ope == 'B')
{
r[l[x]] = r[x]; l[r[x]] = l[x];
l[x] = y; r[x] = r[y];
l[r[y]] = x; r[y] = x;
}
else
printf("%d\n", x ? r[y] : l[y]);
}
}
return 0;
}