描述
你有一些小球,从左到右依次编号为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 }