题目描述

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

1.先将1号同学安排进队列,这时队列中只有他一个人;

2.2~N号同学依次入列,编号为i的同学入列方式为:老师指定编号为i的同学站在编号为1~i -1中某位同学(即之前已经入列的同学)的左边或右边;

3.从队列中去掉M(M<N)个同学,其他同学位置顺序不变。

在所有同学按照上述方法队列排列完毕后,老师想知道从左到右所有同学的编号。

输入输出格式

输入格式:

输入文件arrange.in的第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号同学已经不在队列中则忽略这一条指令。

输出格式:

输入文件arrange.out仅包括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;
#define N 100010
struct Node
{
    int n;//保存节点值
  Node *left,*right;
  Node(int t)//巧妙的构造函数
   {
        left=right=NULL;
        n=t;
    }
};
int main()
{
    Node *p[N];
    int i,n,k,d,head=1;
    p[1]=new Node(1);
    cin>>n;
    /*插入过程*/
    for(i=2;i<=n;i++)
    {
        p[i]=new Node(i);
      scanf("%d%d",&k,&d);
       if(d==0)//左边插入
       {

           if(p[k]->left)//在两个数中间插入
           {
             p[k]->left->right=p[i];
             p[i]->left=p[k]->left;
           }
          p[k]->left=p[i];
          p[i]->right=p[k];
          if(k==head) head=i;//更新队头

       }
       else//右边插入
       {
           if(p[k]->right)
           {
               p[k]->right->left=p[i];
               p[i]->right=p[k]->right;
           }
           p[k]->right=p[i];
           p[i]->left=p[k];
       }

    }
    /*删除过程*/
    int m;
    cin>>m;
    for(i=1;i<=m;i++)
    {
      scanf("%d",&k);
      if(p[k]->left)
       p[k]->left->right=p[k]->right;
      if(p[k]->right)
      {
          p[k]->right->left=p[k]->left;
          if(k==head)
            head=p[k]->right->n;//更新头节点
      }
      p[k]->left=p[k]->right=NULL;
    }
/*输出*/
    while(p[head])
    {
        printf("%d ",p[head]->n);
        p[head]=p[head]->right;
    }

    return 0;
}