队列安排
题目描述
一个学校里老师要将班上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;
}
链表,插入和删除节点的操作可以推一下,缺一不可,确保逻辑的完整性