zoukankan      html  css  js  c++  java
  • 洛谷-P1160 队列安排

    洛谷-P1160 队列安排

    原题链接:https://www.luogu.com.cn/problem/P1160


    题目描述

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

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

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

    输入格式

    第1行为一个正整数N,表示了有N个同学。

    第2−N行,第i行包含两个整数k,p,其中k为小于i的正整数,p为0或者1。若p为0,则表示将iii号同学插入到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左边,此时队列为:

    21

    将同学3插入至同学2右边,此时队列为:

    231

    将同学4插入至同学1左边,此时队列为:

    2341

    将同学3从队列中移出,此时队列为:

    241

    同学3已经不在队列中,忽略最后一条指令

    最终队列:

    241

    数据范围

    对于20%的数据,有N≤10;

    对于40%的数据,有N≤1000;

    对于100%的数据,有N,M≤100000。

    C++代码

    #include <iostream>
    using namespace std;
    
    struct node {
        int l,r;
    }q[100003];
    
    void addLeft(int x, int pos) {
        q[x].r=pos;
        q[q[pos].l].r=x;
        q[x].l=q[pos].l;
        q[pos].l=x;
    }
    
    void addRight(int x, int pos) {
        q[x].l=pos;
        q[q[pos].r].l=x;
        q[x].r=q[pos].r;
        q[pos].r=x;
    }
    
    void del(int x) {
        if(q[x].l==-1)
            return ;
        q[q[x].l].r=q[x].r;
        q[q[x].r].l=q[x].l;
        q[x].l=q[x].r=-1;
    }
    
    int main() {
        int n,m,i,k,p,x;
        for(i=1;i<=n;++i)
            q[i].l=q[i].r=-1;
        q[1].r=-1;q[1].l=0;q[0].r=1;
        cin>>n;
        for(i=2;i<=n;++i) {
            cin>>k>>p;
            if(!p)
                addLeft(i,k);
            else
                addRight(i,k);
        }
        cin>>m;
        for(i=1;i<=m;++i) {
            cin>>x;
            del(x);
        }
        i=q[0].r;
        while(i!=-1) {
            cout<<i<<' ';
            i=q[i].r;
        }
        cout<<endl;
        return 0;
    }
    
  • 相关阅读:
    mysql复制那点事
    全排列问题
    56. Merge Interval
    2. Add Two Numbers
    20. Valid Parentheses
    121. Best Time to Buy and Sell Stock
    120. Triangle
    96. Unique Binary Search Trees
    91. Decode Ways
    72. Edit Distance
  • 原文地址:https://www.cnblogs.com/yuzec/p/13228447.html
Copyright © 2011-2022 走看看