队列安排
队列安排
题目描述
一个学校里老师要将班上N 个同学排成一列,同学被编号为1~N,他采取如下的方法:
- 先将 1 号同学安排进队列,这时队列中只有他一个人;
- 2−N 号同学依次入列,编号为 i 的同学入列方式为:老师指定编号为 i 的同学站在编号为 1−(i−1) 中某位同学(即之前已经入列的同学)的左边或右边;
- 从队列中去掉 M(M<N) 个同学,其他同学位置顺序不变。
在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。
输入输出格式
输入格式:
第 1 行为一个正整数 N ,表示了有 N 个同学。
第 2−N 行,第 i 行包含两个整数 k,p ,其中 k 为小于 i 的正整数,p 为 0 或者 1 。若 p 为 0 ,则表示将 i 号同学插入到 k 号同学的左边,p 为 1 则表示插入到右边。
第 N+1 行为一个正整数 M ,表示去掉的同学数目。
接下来 M 行,每行一个正整数 x ,表示将 x 号同学从队列中移去,如果 x 号同学已经不在队列中则忽略这一条指令。
输出格式:
1 行,包含最多 N 个空格隔开的正整数,表示了队列从左到右所有同学的编号,行末换行且无空格。
输入输出样例
输入样例 #1:
4
1 0
2 1
1 0
2
3
3
输出样例 #1:
2 4 1
说明
样例解释:
将同学 2 插入至同学 1 左边,此时队列为:
2 1
将同学 3 插入至同学 2 右边,此时队列为:
2 3 1
将同学 4 插入至同学 1 左边,此时队列为:
2 3 4 1
将同学 3 从队列中移出,此时队列为:
2 4 1
同学 3 已经不在队列中,忽略最后一条指令
最终队列:
2 4 1
数据范围
对于 20% 的数据,有 N≤10 ;
对于 40% 的数据,有 N≤1000 ;
对于 100% 的数据,有 N,M≤100000 。
代码
#include <bits/stdc++.h>
using namespace std;
struct node{
int next,pre,data;
}que[100005];
int main(){
int n;
cin>>n;
que[1].pre=0;
que[1].next=n+1;
que[1].data=1;
que[0].next=1;
que[n+1].pre=1;
for (int i=2;i<=n;++i){
int a,b;
scanf("%d %d",&a,&b);
if (b==1){
int h=a;
que[i].next=que[h].next;
que[h].next=i;
que[que[i].next].pre=i;
que[i].pre=h;
}else{
int h=a;
que[i].pre=que[h].pre;
que[h].pre=i;
que[que[i].pre].next=i;
que[i].next=h;
}
que[i].data=1;
}
int m;
cin>>m;
for (int i=1;i<=m;++i){
int a;
scanf("%d",&a);
if (que[a].data==1){
que[a].data=0;
int pp,nn;
pp=que[a].pre;
nn=que[a].next;
que[pp].next=nn;
que[nn].pre=pp;
}
}
for (int i=que[0].next;i!=0;i=que[i].next){
if (que[i].data!=0) printf("%d ",i);
}
return 0;
}
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。
本文链接:https://hs-blog.axell.top/archives/18/