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

    题目描述

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

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

    2. 2−N2-N2N号同学依次入列,编号为i的同学入列方式为:老师指定编号为i的同学站在编号为1∼(i−1)1sim (i -1)1(i1)中某位同学(即之前已经入列的同学)的左边或右边;

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

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

    输入输出格式

    输入格式:

    111行为一个正整数NNN,表示了有NNN个同学。

    2−N2-N2N行,第iii行包含两个整数k,pk,pk,p,其中kkk为小于iii的正整数,ppp为000或者111。若ppp为000,则表示将iii号同学插入到kkk号同学的左边,ppp为111则表示插入到右边。

    N+1N+1N+1行为一个正整数MMM,表示去掉的同学数目。

    接下来MMM行,每行一个正整数xxx,表示将xxx号同学从队列中移去,如果xxx号同学已经不在队列中则忽略这一条指令。

    输出格式:

    111行,包含最多NNN个空格隔开的正整数,表示了队列从左到右所有同学的编号,行末换行且无空格。

    输入输出样例

    输入样例#1: 复制
    4
    1 0
    2 1
    1 0
    2
    3
    3
    输出样例#1: 复制
    2 4 1
    
    

    说明

    样例解释:

    将同学222插入至同学111左边,此时队列为:

    212 121

    将同学333插入至同学222右边,此时队列为:

    2312 3 1231

    将同学444插入至同学111左边,此时队列为:

    23412 3 4 12341

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

    2412 4 1241

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

    最终队列:

    2412 4 1241

    数据范围

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

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

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

    ----------------------------------------分割分割分割------------------------------------------------------------------------

    很基础很基础

    我拿不准的地方在于

    如何输出:

    第一个是什么?

    所以借鉴了一下

    -----------------------------------------------------------------------------------------------------------------------------------

    #include<cstdio>
    using namespace std;
    #define maxn 100010
    int data[maxn],nxt[maxn],pre[maxn];
    int n,cnt = 1;
    bool flag[maxn];
    void add(int l,int r,int x) {
        data[++cnt] = x;
        pre[cnt] = l;
        nxt[cnt] = r;
        nxt[l] = cnt;
        pre[r] = cnt;
    }
    void del(int x) {
        nxt[pre[x]] = nxt[x];
        pre[nxt[x]] = pre[x];
    }
    int main() {
        scanf("%d",&n);
        data[1] = 1;
        int head = 1;
        flag[1] = true;
        for(int i = 2; i <= n; i++) {
            int k,p;
            scanf("%d%d",&k,&p);
            flag[i] = true;
            if(p == 0) {
                if(k == head)
                    head = i;
                add(pre[k],k,i);
            } else
                add(k,nxt[k],i);
        }
        int m;
        scanf("%d",&m);
        for(int i = 1; i <= m; i++) {
            int x;
            scanf("%d",&x);
            if(!flag[x])
                continue;
            if(x == head)
                head = nxt[x];
            del(x);
            cnt--;
            flag[x] = false;
        }
        for(int i = head; cnt; i = nxt[i]) {
            printf("%d ",data[i]);
            cnt--;
        }
        return 0;
    }
    ----------------------------------------------------------------------------------------------
     
    希望下次记得
    设一个变量
    用来记录第一个元素
     
    加油
  • 相关阅读:
    shell进行mysql统计
    java I/O总结
    Hbase源码分析:Hbase UI中Requests Per Second的具体含义
    ASP.NET Session State Overview
    What is an ISAPI Extension?
    innerxml and outerxml
    postman
    FileZilla文件下载的目录
    how to use webpart container in kentico
    Consider using EXISTS instead of IN
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10296663.html
Copyright © 2011-2022 走看看