因为有很多删除与插入的操作,所以用链表是最好的方法。一道基础的链表题,用stl自带的链表解决,第一次使用,记录迭代器下标还是第一次见到-。-
#pragma comment (linker,"/STACK:102400000,102400000") #include #include #include #include #include #include #include #include #include #include #include #include #define myself i,l,r #define lson i<<1 #define rson i<<1|1 #define Lson i<<1,l,mid #define Rson i<<1|1,mid+1,r #define half (l+r)/2 #define lowbit(x) x&(-x) #define min4(a,b,c,d) min(min(a,b),min(c,d)) #define min3(x,y,z) min(min(x,y),z) #define max3(x,y,z) max(max(x,y),z) #define max4(a,b,c,d) max(max(a,b),max(c,d)) #define pii make_pair #define pr pair typedef long long ll; const int inff=0x3f3f3f3f; const long long inFF=9223372036854775807; const int dir[4][2]={0,1,0,-1,1,0,-1,0}; const int mdir[8][2]={0,1,0,-1,1,0,-1,0,1,1,-1,1,1,-1,-1,-1}; const double eps=1e-10; const double E=2.718281828459; const double pi=acos(-1.0); const int mod=1e6+3; using namespace std; const int maxn=2e5+5; list l; using itt=list::iterator; itt pos[maxn];//记录某个数迭代器下标 int erased[maxn];//记录某个数是否被删除 int main() { int n,m; cin>>n; l.push_front(1); pos[1]=l.begin(); for(int i=2;i<=n;i++) { int k,p; scanf("%d %d",&k,&p); if(p==0) pos[i]=l.insert(pos[k],i); else { auto nextit =next(pos[k]); pos[i]=l.insert(nextit,i); } } cin>>m; for(int i=1,x;i<=m;i++) { scanf("%d",&x); if(!erased[x]) l.erase(pos[x]); erased[x]=1; } int flag=1; for(auto it=l.begin();it!=l.end();++it) { if(!flag) printf(" %d",*it); else printf("%d",*it),flag=0; } printf("\n"); return 0; }