数据结构、链表

由于序列内部元素不重,使用 list 维护序列,使用 unordered_map 记录每个编号对应的迭代器可以将插入操作和删除操作的时间复杂度优化至 $O(1)$。

时间复杂度 $O(n)$。

#include<bits/stdc++.h>
using namespace std;
unordered_map<int,list<int>::iterator> m;
list<int> s;
int n,k;
int main(){
    scanf("%d",&n);
    s.push_back(1),m[1]=s.begin();
    for(int i=2;i<=n;i++){
        static int x,y;
        scanf("%d%d",&x,&y);
        auto it=y ? next(m[x]):m[x];
        m[i]=s.insert(it,i);
    }
    scanf("%d",&k);
    for(int i=1;i<=k;i++){
        static int x;
        scanf("%d",&x);
        if(m.count(x)) s.erase(m[x]),m.erase(x);
    }
    for(auto i:s) printf("%d ",i);
    return 0;
}
最后修改:2024 年 05 月 26 日
如果觉得我的文章对你有用,请随意赞赏