題目描述
一個學校里老師要將班上N個同學排成一列,同學被編號爲1~N,他採取如下的方法:
1.先將1號同學安排進隊列,這時隊列中只有他一個人;
2.2~N號同學依次入列,編號爲i的同學入列方式爲:老師指定編號爲i的同學站在編號爲1~i -1中某位同學(即之前已經入列的同學)的左邊或右邊;
3.從隊列中去掉M(M
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
#include<algorithm>
using namespace std;
struct node {
int left;
int right;
} que[100001];
int head = 1;
int main() {
int n;
scanf("%d",&n);
for(int i = 2; i<=n; i++) {
int t1,t2;
scanf("%d%d",&t1,&t2);
if(t2) {
que[i].right = que[t1].right;
que[t1].right = i;
que[i].left = t1;
que[que[i].right].left = i;
} else {
que[i].left = que[t1].left;
que[t1].left = i;
que[i].right = t1;
que[que[i].left].right = i;
if(t1 == head){
head = i;
}
}
}
int m;
scanf("%d",&m);
for(int i = 1; i<=m; i++) {
int tmp;
scanf("%d",&tmp);
que[que[tmp].left].right = que[tmp].right;
que[que[tmp].right].left = que[tmp].left;
que[tmp].left = que[tmp].right = 0;
}
printf("%d",head);
int tmp = head;
while(que[tmp].right){
tmp = que[tmp].right;
printf(" %d",tmp);
}
return 0;
}
鏈表,插入和刪除節點的操作可以推一下,缺一不可,確保邏輯的完整性