转自:http://adonis0147.blog.163.com/blog/static/162553854201061410316118/
一开始用链表操作,但是操作太多,且没有办法直接找到相应的下标,所以上网看看大牛的解法,这个解法自己觉得很不错了,所以贴出来
#include <iostream>
#include <cstdio>
using namespace std;
int prev[501000];
int next[501000];
int main()
{
int t, n, m;
int q, a, b;
int counter, s;
scanf("%d", &t);
while (t --)
{
scanf("%d%d", &n, &m);
for (int i = 1; i <= n + 1; i ++)
{
next[i - 1] = i;
prev[i] = i - 1;
}
while (m --)
{
scanf("%d%d%d", &q, &a, &b);
if (q == 1)
{
next[prev[a]] = next[a];
prev[next[a]] = prev[a];
next[prev[b]] = a;
prev[a] = prev[b];
next[a] = b;
prev[b] = a;
}
else //这里之前我写的是 if (q == 2) 结果得到了 N 次 WA,感觉数据貌似有问题
{
next[prev[a]] = next[a];
prev[next[a]] = prev[a];
next[a] = next[b];
prev[next[b]] = a;
next[b] = a;
prev[a] = b;
}
}
counter = 1;
s = next[0];
while (counter <= n)
{
printf("%d ", s);
s = next[s];
counter ++;
}
printf("\n");
}
return 0;
}