#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#include <math.h>
#include <string.h>
#include <time.h>
typedef struct node
{
int l,r,fl;
}Node;
Node list[100001];
//建立一个数组结构,下表为序号 维护时更改是否存在(FLAG)和左右链接标号
// void fun(int n){
// if((list[n].l==0&&list[n].r==0)||list[n].fl==0) return;
// if(list[n].l!=0) fun(list[n].l);
// if(list[n].fl==1) printf("%d ",n);
// if(list[n].r!=0) fun(list[n].r);
// }
//遍历函数先找到最左端,再一直往右遍历即可
int main(){
int n,i,k,op,m;
// for(i=0;i<100001;i++){
// list[i].l=list[i].r=0;
// }
scanf("%d",&n);
list[1].fl=1;
for(i=2;i<=n;i++){
scanf("%d%d",&k,&op);
if(op==0){
list[i].l=list[k].l;
list[i].r=k;
list[list[k].l].r=i;
list[k].l=i;
}else if(op==1){
list[i].r=list[k].r;
list[i].l=k;
list[list[k].r].l=i;
list[k].r=i;
}
list[i].fl=1;
}
// for(i=1;i<=n;i++){
// printf("%d %d %d\n",list[i].l,list[i].r,list[i].fl);
// }
scanf("%d",&m);
for(i=1;i<=m;i++){
int p;
scanf("%d",&p);
list[list[p].r].l=list[p].l;
list[list[p].l].r=list[p].r;
list[p].fl=0;
}
int st=1;
while(list[st].l!=0){
st=list[st].l;
}
while(list[st].r!=0){
if(list[st].fl==0) continue;
printf("%d ",st);
st=list[st].r;
}
printf("%d\n",st);
return 0;
}
这还TLE就离谱……按道理数组应该快很多(吧)