题目传送门:http://acm.nyist.net/JudgeOnline/problem.php?pid=511
跳舞链是带哨兵节点的双向循环链表,更加优美的形式是将该链表用静态链表的形式实现,使得查找,删除和恢复操作的时间复杂度均为O(1)
#include <cstring>
#include <cstdio>
using namespace std;
const int MAX = 10010;
int data[MAX], left[MAX], right[MAX];
int t,n,m;
//初始化,下标为0的结点为哨兵结点
void init()
{
for (int i = 1; i < n; i ++) {
data[i] = i;
left[i] = i - 1;
right[i] = i + 1;
}
data[0] = 0; right[0] = 1; left[0] = n;
data[n] = n; right[n] = 0; left[n] = n - 1;
return ;
}
void moveb(int a, int b, int tag)
{
left[right[a]] = left[a];
right[left[a]] = right[a];
if (tag == 0) {
right[a] = b;
left[a] = left[b];
} else {
left[a] = b;
right[a] = right[b];
}
// “跳舞”,跳舞链因此得名
left[right[a]] = a;
right[left[a]] = a;
return ;
}
inline int query(int a, int tag)
{
if (tag == 0) {
if (left[a] != 0)
return left[a];
else
return left[0];
} else {
if (right[a] != 0)
return right[a];
else
return right[0];
}
}
int main()
{
scanf("%d",&t);
char c;
int a,b;
while (t --) {
scanf("%d%d",&n,&m);
init();
for (int i = 1; i <= m; i ++) {
scanf(" %c%d%d",&c,&a,&b);
if (c == 'A') {
moveb(a,b,0);
}
if (c == 'B') {
moveb(a,b,1);
}
if (c == 'Q') {
printf("%d\n",query(b,a));
}
}
}
return 0;
}