题解: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;
}

浙公网安备 33010602011771号