Sicily1934——移动小球

来源:互联网 发布:minitab 前后数据分析 编辑:程序博客网 时间:2024/06/03 07:33

1934. 移动小球

限制条件

时间限制: 1 秒, 内存限制: 32 兆

题目描述

你有一些小球,从左到右依次编号为1,2,3,...,n. 你可以执行两种指令(1或者2)。其中, 1 X Y表示把小球X移动到小球Y的左边, 2 X Y表示把小球X移动到小球Y右边。 指令保证合法,即X不等于Y。 例如,初始状态1,2,3,4,5,6的小球执行1 1 4后,小球1被移动到小球4的左边,即2,3,1,4,5,6。如果再执行2 3 5,结点3将会移到5的右边,即2,1,4,5,3,6。 

输入格式

第一行为一个整数t(0<t<10),表示测试用例个数。每个测试用例的第一行为两个整数n(1<n<=500000)和m(0<m<100000),n表示小球的个数,m为指令条数,以下m行每行为一条指令。 

输出格式

为每个测试用例单独输出一行,从左到右输出最后序列,每个数字后面跟一个空格。 

样例输入

2 6 2 1 1 4 2 3 5 5 1 2 1 5 

样例输出

2 1 4 5 3 6  2 3 4 5 1  
感觉自己能把这题做出来好感人啊!!!

今天才知道原来可以用多重数组表示双向链表,而且蛮好理解的。

比如这题,申请两个数组l,r。然后数组的下表其实就是那个数,l【x】就表示x左边相邻的数,r【x】就表示x右边相邻的数。然后考虑,每一次操作,那些数的左右两边的值会改变就行了。

当然我开始写了一个list版,结果可想而知,超时。。。
#include <iostream>#include <list>using namespace std;void ope(list<int> &num,int op,int x,int y){list<int>::iterator i;for(i = num.begin(); i != num.end(); i++){if(*i == x){num.erase(i);break;} }for(i = num.begin(); i != num.end(); i++){if(*i == y){list<int>::iterator tem = i;if(op == 1) tem--;else if(op == 2) tem++;num.insert(tem,x);}}}int main(){int T;cin >> T;while(T--){list<int> num;int n,m;cin >> n >> m;for(int i = 1; i <= n; i++) num.push_back(i);int op,x,y;for(int i = 0; i < m; i++){cin >> op >> x >> y;ope(num,op,x,y);}list<int>::iterator k;for(k = num.begin(); k != num.end(); k++){cout << *k << " ";}cout << endl;}return 0;}

然后是多重数组模拟双向链表版:
#include <iostream>#include <algorithm>#include <map>#include <vector>#include <iomanip>#include <cstdio>#include <string>#include <cstring>#include <cstdlib> using namespace std;int l[500001],r[500001] = {1};void solve(int op,int x,int y){r[l[x]] = r[x];l[r[x]] = l[x];if(op == 1){r[l[y]] = x;l[x] = l[y];l[y] = x;r[x] = y;}else if(op == 2){l[r[y]] = x;r[x] = r[y];r[y] = x;l[x] = y;}}void print(int n){int tem = 0;while(n--){tem = r[tem];cout << tem << " "; }cout << endl;}int main(){int T;cin >> T;while(T--){int n,m;cin >> n >> m;for(int i = 1; i <= n; i++){l[i] = i - 1;r[i] = i + 1;}int op,x,y;for(int i = 0; i < m; i++){cin >> op >> x >> y;solve(op,x,y);}print(n);}return 0;} 

加油加油!
0 0
原创粉丝点击