问题描述
有n辆自行车依次来到停车棚,除了第一辆自行车外,每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有3辆自行车,从左到右编号为:3,5,1。现在编号为2的第4辆自行车要停在5号自行车的左边,所以现在停车棚里的自行车编号是:3,2,5,1)。给定n辆自行车的停放情况,按顺序输出最后停车棚里的自行车编号。
输入格式
第一行一个整数n。
第二行一个整数x。表示第一辆自行车的编号。
以下n-1行,每行3个整数x,y,z。
z=0时,表示编号为x的自行车恰停放在编号为y的自行车的左边
z=1时,表示编号为x的自行车恰停放在编号为y的自行车的右边
第二行一个整数x。表示第一辆自行车的编号。
以下n-1行,每行3个整数x,y,z。
z=0时,表示编号为x的自行车恰停放在编号为y的自行车的左边
z=1时,表示编号为x的自行车恰停放在编号为y的自行车的右边
输出格式
从左到右输出停车棚里的自行车编号
样例输入
4
3
1 3 1
2 1 0
5 2 1
3
1 3 1
2 1 0
5 2 1
样例输出
3 2 5 1
数据规模和约定
n<=100000
自行车编号为不超过100000的正整数。
自行车编号为不超过100000的正整数。
解题思路:用数组模拟双向链表的模板题目,基础不扎实,调试了1小时。
在模板的基础上增加一个数组e_idx[],若e[idx] = x,则e_idx[x] = idx,互为反函数(代码的12,13行)。便于通过值找到其下标(也就是要插入的位置)
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int N = 200010; 4 int e[N], l[N], r[N], idx; 5 int e_idx[N]; //e_idx(x) = idx;即表示值为x的节点的下标是idx 6 void init() { 7 r[0] = 1; 8 l[1] = 0; 9 idx = 2; 10 } 11 void add(int k, int x) { 12 e[idx] = x; 13 e_idx[x] = idx; 14 r[idx] = r[k]; 15 l[idx] = k; 16 l[r[k]] = idx; 17 r[k] = idx; 18 //cout << "e:" << x << " " << "idx:" << idx << endl; 19 idx++; 20 } 21 int main() { 22 int n; 23 cin >> n; 24 init(); 25 int a; 26 cin >> a; 27 add(0, a); 28 n--; 29 /*cout << "结果为:"; 30 for (int i = r[0]; i != 1; i = r[i]) { 31 cout << e[i] << " "; 32 } 33 cout << endl;*/ 34 while (n--) { 35 int x, y, z; 36 cin >> x >> y >> z; 37 if (z == 0) { //左边插入 38 add(l[e_idx[y]], x); 39 } else { //右边插入 40 add(e_idx[y], x); 41 } 42 /*cout << "结果为:"; 43 for (int i = r[0]; i != 1; i = r[i]) { 44 cout << e[i] << " "; 45 } 46 cout << endl;*/ 47 } 48 for (int i = r[0]; i != 1; i = r[i]) { 49 cout << e[i] << " "; 50 } 51 return 0; 52 }