华师一附中OI组

 找回密码
 立即注册
搜索
热搜: 活动 交友 discuz
查看: 1132|回复: 1
打印 上一主题 下一主题

P1160 队列安排

[复制链接]

738

主题

1485

帖子

5422

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
5422
跳转到指定楼层
楼主
发表于 2018-5-13 19:50:13 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
https://www.luogu.org/problemnew/show/P1160
题目描述
一个学校里老师要将班上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。
回复

使用道具 举报

14

主题

106

帖子

317

积分

中级会员

Rank: 3Rank: 3

积分
317
沙发
发表于 2018-9-16 13:40:28 | 只看该作者

模拟链表

  1. #include<iostream>
  2. using namespace std;
  3. ///0:num 1:left 2:right
  4. int a[100010][3];
  5. int n,head,m,x,p;
  6. int main()
  7. {
  8.     cin>>n;head=1;
  9.     a[1][0]=1;
  10.     for(int i=2;i<=n;i++)
  11.     {
  12.         cin>>x>>p;
  13.         a[i][0]=i;
  14.         if(p==0)
  15.         {
  16.             a[a[x][1]][2]=i;a[i][2]=x;
  17.             a[i][1]=a[x][1];a[x][1]=i;
  18.             if(x==head) head=i;
  19.         }
  20.         else
  21.         {
  22.             a[a[x][2]][1]=i;a[i][1]=x;
  23.             a[i][2]=a[x][2];a[x][2]=i;
  24.         }
  25.     }
  26.     cin>>m;int t=n;
  27.     for(int i=1;i<=m;i++)
  28.     {
  29.         cin>>x;
  30.         if(a[x][0]!=0)
  31.         {
  32.             a[x][0]=0;
  33.             a[a[x][1]][2]=a[x][2];
  34.             a[a[x][2]][1]=a[x][1];
  35.             t--;
  36.             if(x==head) head=a[head][2];
  37.         }
  38.     }
  39.     int tt=head;
  40.     for(int i=1;i<=t;i++)
  41.     {
  42.         cout<<a[tt][0]<<" ";
  43.         tt=a[tt][2];
  44.     }
  45.     return 0;
  46. }
复制代码
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

QQ|Archiver|手机版|小黑屋|服务支持:DZ动力|华师一附中OI组  

GMT+8, 2024-12-25 14:22 , Processed in 0.193338 second(s), 23 queries .

Powered by Discuz! X3.2

© 2001-2013 Comsenz Inc.

快速回复 返回顶部 返回列表