题面:
题解:
主要学习一下对于链表怎么O(1)的去操作。
代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<string>
#include<cstring>
#include<algorithm>
#include<map>
#include<set>
#include<queue>
#include<deque>
#include<stack>
#include<vector>
#include<list>
#include<iterator>
#define ll long long
#define llu unsigned ll
#define iu unsigned int
#define ld long double
//#define int ll
using namespace std;
const int inf=0x3f3f3f3f;
const ll lnf=0x3f3f3f3f3f3f3f3f;
const double dnf=1e15;
const double eps=1e-8;
const double pi=acos(-1.0);
const int mod=1e9+7;
const int maxn=100100;
list<int>::iterator pos[maxn];
list<int>li;
bool ha[maxn];
int main(void)
{
int n,m,x,y;
scanf("%d",&n);
li.push_back(1);
pos[1]=li.begin();
for(int i=2;i<=n;i++)
{
scanf("%d%d",&x,&y);
if(y==0)
pos[i]=li.insert(pos[x],i);
else pos[i]=pos[x],pos[i]=li.insert(++pos[i],i);
}
scanf("%d",&m);
for(int i=1;i<=m;i++)
{
scanf("%d",&x);
if(!ha[x])
li.erase(pos[x]);
ha[x]=true;
}
for(auto it:li)
printf("%d ",it);
return 0;
}