描述
你有一些小球,从左到右依次编号为1,2,3,…,n,
你可以执行两种指令。其中A X Y表示把小球X移动到小球Y左边,B X Y表示把小球X移动到小球Y右边。指令保证合法,即X不等于Y。
输入 小球个数n。指令条数m和m条指令,注意,1≤n≤500000,0≤m≤100000。
输出 从左到右输出最后的小球序列。
样例输入
6 2
A 1 4
B 3 5
样例输出
2 1 4 5 3 6
1 #include <iostream>
2 #include <cstring>
3 using namespace std;
4
5 int m,n;//n个小球,m条指令
6
7 int main()
8 {
9 int i,j,k;
10 char ch;//指令格式
11 int a,b;
12 int left[1000],right[1000];
13
14 while(cin>>n>>m)
15 {
16 if(1==n)
17 {
18 cout<<1<<endl;
19 continue;
20 }
21 for(i=0; i<n; i++)
22 left[i+1] = i;
23 left[n+1] = n;
24 for(i=0; i<n; i++)
25 right[i] = i+1;
26
27 while(m--)
28 {
29 getchar();//吸收换行
30 cin>>ch>>a>>b;
31 right[left[a]]=right[a];//删除a
32 left[right[a]]=left[a];
33 if(ch=='A')//a 移到b左边
34 {
35 left[a] = left[b];
36 right[a] = b;
37 right[left[b]] = a;
38 left[b] = a;
39 }
40 if(ch=='B')
41 {
42 left[a] = b;
43 right[a] = right[b];
44 right[b] = a;
45 left[right[b]] = a;
46 }
47 }
48 //注意输出不可直接输出right[i]
49 int temp = right[0];
50 cout<<temp;
51 for(i=1; i<n; i++)
52 {
53 temp = right[temp];
54 cout<<" "<<temp;
55 }
56 cout<<endl;
57
58 }
59 return 0;
60 }