题目链接

题面:

题解:
主要学习一下对于链表怎么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;
}