zoukankan      html  css  js  c++  java
  • 洛谷 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。

     1 #include<iostream>
     2 #include<cstdio>
     3 using namespace std;
     4 int n,rit[100010]={0},lft[100010]={0},m;
     5 bool exist[100010]={0};
     6 int main()
     7 {
     8     scanf("%d",&n);
     9     rit[0]=1;exist[1]=true;
    10     for(int i=2,x,pos;i<=n;i++){
    11         scanf("%d%d",&pos,&x);
    12         exist[i]=true;
    13         if(x==0){
    14             rit[i]=pos;
    15             lft[i]=lft[pos];
    16             rit[lft[pos]]=i;
    17             lft[pos]=i;
    18         }
    19         else{
    20             lft[i]=pos;
    21             rit[i]=rit[pos];
    22             lft[rit[pos]]=i;
    23             rit[pos]=i;
    24         }
    25     }
    26     int del=0;
    27     scanf("%d",&m);
    28     for(int i=1,x;i<=m;i++){
    29         scanf("%d",&x);
    30         if(exist[x]==false){
    31             del++;continue;
    32         }
    33         rit[lft[x]]=rit[x];
    34         lft[rit[x]]=lft[x];
    35         lft[x]=0;rit[x]=0;exist[x]=false;
    36     }
    37     int Mix=n-m+del,cur=0;
    38     for(int i=0;i<Mix;i++){
    39         cur=rit[cur];
    40         printf("%d ",cur);
    41     }
    42     return 0;
    43 }

    指针版有待更新

  • 相关阅读:
    [Java] 开课吧--JVM
    [Java] 数据分析 -- 大数据
    [Java] 数据分析 -- NoSQL数据库
    [Java]数据分析--聚类
    [Java] 数据分析--分类
    [Java] 数据分析 -- 回归分析
    [Java] 数据分析--统计
    [Java]数据分析--数据可视化
    [Java] 数据分析--数据预处理
    从零开始的react入门教程(十),快速上手react-redux,相对于redux它究竟简化了什么?
  • 原文地址:https://www.cnblogs.com/suishiguang/p/6367770.html
Copyright © 2011-2022 走看看