');}

队列安排

Author Avatar
Axell 8月 22, 2018
  • 在其它设备中阅读本文章

队列安排

题目描述

一个学校里老师要将班上N 个同学排成一列,同学被编号为1~N,他采取如下的方法:

  1. 先将 1 号同学安排进队列,这时队列中只有他一个人;
  2. 2−N 号同学依次入列,编号为 i 的同学入列方式为:老师指定编号为 i 的同学站在编号为 1−(i−1) 中某位同学(即之前已经入列的同学)的左边或右边;
  3. 从队列中去掉 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:

  1. 4
  2. 1 0
  3. 2 1
  4. 1 0
  5. 2
  6. 3
  7. 3

输出样例 #1:

  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 。

代码

  1. #include <bits/stdc++.h>
  2. using namespace std;
  3. struct node{
  4. int next,pre,data;
  5. }que[100005];
  6. int main(){
  7. int n;
  8. cin>>n;
  9. que[1].pre=0;
  10. que[1].next=n+1;
  11. que[1].data=1;
  12. que[0].next=1;
  13. que[n+1].pre=1;
  14. for (int i=2;i<=n;++i){
  15. int a,b;
  16. scanf("%d %d",&a,&b);
  17. if (b==1){
  18. int h=a;
  19. que[i].next=que[h].next;
  20. que[h].next=i;
  21. que[que[i].next].pre=i;
  22. que[i].pre=h;
  23. }else{
  24. int h=a;
  25. que[i].pre=que[h].pre;
  26. que[h].pre=i;
  27. que[que[i].pre].next=i;
  28. que[i].next=h;
  29. }
  30. que[i].data=1;
  31. }
  32. int m;
  33. cin>>m;
  34. for (int i=1;i<=m;++i){
  35. int a;
  36. scanf("%d",&a);
  37. if (que[a].data==1){
  38. que[a].data=0;
  39. int pp,nn;
  40. pp=que[a].pre;
  41. nn=que[a].next;
  42. que[pp].next=nn;
  43. que[nn].pre=pp;
  44. }
  45. }
  46. for (int i=que[0].next;i!=0;i=que[i].next){
  47. if (que[i].data!=0) printf("%d ",i);
  48. }
  49. return 0;
  50. }

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 3.0 未本地化版本许可协议进行许可。

本文链接:https://hs-blog.axell.top/archives/18/