题目:https://www.luogu.org/problemnew/show/P1160
怎样删结点,怎样增加结点,详见代码说明。
AC代码:
#include<cstdio>
#include<iostream>
using namespace std;
const int Maxn=1e5+5;
int n,m,l[Maxn],r[Maxn],k,p,cns;
bool vis[Maxn];
int main(){
cin>>n;
r[0]=1;
l[1]=0;
r[1]=Maxn;
l[Maxn]=1;
for(int i=2;i<=n;i++){
scanf("%d%d",&k,&p);
if(p==0){
l[i]=l[k];//4行代码,增加结点
l[k]=i;
r[l[i]]=i;
r[i]=k;
}
if(p==1){
r[i]=r[k];//4行代码,增加结点
r[k]=i;
l[r[i]]=i;
l[i]=k;
}
}
cin>>m;
for(int i=1;i<=m;i++){
scanf("%d",&k);
if(!vis[k]){
vis[k]=1;
r[l[k]]=r[k];//2行代码,删除结点
l[r[k]]=l[k];
n--;
}
}
k=0;
cns=0;
while(cns+1<n){
cns++;
printf("%d ",r[k]);
k=r[k];
}
printf("%d\n",r[k]);
return 0;
}