队列安排

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:

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/