P1160 队列安排
用数组和结构题模拟链表
#include <bits/stdc++.h>
using namespace std;
int n, m, k, p, x, head;
struct node
{
int data;
int pre;
int next;
}a[100010];
//将x插到y的左边
void insert(int x, int y)
{
//如果y左边没有同学
if(a[y].pre==0){
head=x;
a[y].pre=x;
a[x].next=y;
}
else{ //y左边有同学
int temp=a[y].pre; //记录y同学左边的同学temp
a[temp].next=x; //将temp同学的右侧标记为x同学
a[x].pre=temp; //将x同学的左侧标记为temp同学
a[x].next=y; //将x同学的右侧标记为y同学
a[y].pre=x; //将y同学的左侧标记为x同学
}
}
void push_back(int x, int y)
{
//如果y右边没有同学
if(a[y].next==0){
a[y].next=x;
a[x].pre=y;
}
else{ //y右边有同学
int temp=a[y].next; //记录y同学右边的同学temp
a[temp].pre=x; //将temp同学的左侧标记为x同学
a[x].next=temp; //将x同学的右侧标记为temp同学
a[x].pre=y; //将x同学的左侧标记为y同学
a[y].next=x; //将y同学的右侧标记为x同学
}
}
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
a[i].data=i;
}
head=1; //头部位置
for(int i=2; i<=n; ++i){
scanf("%d %d", &k, &p);
if(p==0){ //将i号同学插到k同学的左边
insert(i, k);
}
else{ //将i号同学插到k同学的右边
push_back(i, k);
}
}
scanf("%d", &m);
for(int i=1; i<=m; ++i){
scanf("%d", &x);
a[x].data=0;
}
while(a[head].next!=0){
if(a[head].data!=0){
printf("%d ", a[head].data);
}
head=a[head].next;
}
if(a[head].data!=0){
printf("%d", a[head].data);
}
return 0;
}