题解:P1160 队列安排

思路

这是一道用链表就能实现的模拟题(个人感觉评橙会更好)。
我们可以使用结构体来存储节点的左手和右手。
这道题也可以直接使用STL中的list。(但是完全没有必要。。。)
对于已经删除的节点,我们不需要真的删除。
我们只需要给这个节点打一个标记,在输出答案的时候跳过它即可。

AC代码

#include<bits/stdc++.h>
#define debug(a) cout<<#a<<"="<<a<<'\n';
#define il inline

using namespace std;
using ll = long long;
using ull = unsigned long long;

const int mx=1e5+10;

int n,m,x,k,f;
struct T{
    int l,r;
	int d;
}t[mx]={0};

il void add(int i,int k,int f){
    if(f==1){
        t[k].r=t[i].r;
        t[k].l=i; 
        t[i].r=k;
        t[t[k].r].l=k;
    }else{
        t[k].r=i;
        t[k].l=t[i].l;
        t[i].l=k;
        t[t[k].l].r=k;
    }
}

int main(){
	// freopen("test.in","r",stdin);
	// freopen("test.out","w",stdout);
	ios::sync_with_stdio(0),cout.tie(0),cin.tie(0);
    cin>>n;
    t[0].r=0,t[0].l=0;
    add(0,1,1);
    for (int i=2;i<=n;i++){cin>>x>>f;add(x,i,f);}
    cin>>m;
    while(m--){cin>>x;t[x].d=1;}
    for (int i=t[0].r;i;i=t[i].r){
        if (t[i].d==1)continue;
        cout<<i<<' ';
    }
    return 0;
}
posted @ 2025-03-01 15:38  Zheng_iii  阅读(34)  评论(0)    收藏  举报