题目传送门sxynla
记录每个人左右相邻的两个人,zuo数组和 you 数组
#include <iostream>
#include <cstdio>
using namespace std;
const int N=100010;
int n,zuo[N],you[N],tou,m;
bool vis[N];
int main()
{
cin>>n;tou=1;
for(int i=2;i<=n;i++){
int k,p;
scanf("%d%d",&k,&p);
if(p){
zuo[i]=k;//p=1时,插入的人的右边就等于k右边的人,左边就是k
you[i]=you[k];
zuo[you[k]]=i;//k右边的人的左边的人就变成 i
you[k]=i; //k右边变成i
}
else{
you[i]=k; //同理
zuo[i]=zuo[k];
you[zuo[k]]=i;
zuo[k]=i;
}
}
cin>>m;
for(int i=1;i<=m;i++){
int x;
scanf("%d",&x);
if(vis[x]) continue;
zuo[you[x]]=zuo[x];
you[zuo[x]]=you[x];
vis[x]=1;
}
while(zuo[tou]) tou=zuo[tou]; //找到队首 头=tou
while(you[tou]) printf("%d ",tou),tou=you[tou];
printf("%d ",tou);
return 0;
}