显然,这又是一道模拟链表的题型;
#includeusing namespace std; struct student { int left; //左手 int right; //右手 int e = 1; //是否删除 }stu[1000000]; //模拟链表 void add(int i,int k,int f) //则表示将i号同学插入到k号同学的左边,f为1则表示插入到右边, { if (f == 0) //i插入到k的左边 { stu[i].left = stu[k].left; stu[stu[k].left].right = i; stu[i].right = k; stu[k].left = i; } if (f == 1) //i插入到k的右边 { stu[i].right = stu[k].right; stu[stu[k].right].left = i; stu[k].right = i; stu[i].left = k; } } int main() { int n; cin >> n; //n个同学 int k, p; stu[0].right = 1; stu[0].left = 1; stu[1].left = 0; stu[1].right = 0; for (int i = 2; i<=n; i++) { cin >> k >> p; add(i, k, p); //则表示将i号同学插入到k号同学的左边,p为1则表示插入到右边, } cin >> n; while (n--) { cin >> k; stu[k].e = 0; } for (int i = 0; ;i=stu[i].right) { if (stu[i].e == 1&&i!=0) { cout << i << ' '; } if (stu[i].right == 0) break; } return 0; }



