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;
    }
    ----------------------------------------------------------------------------------------------
     
    希望下次记得
    设一个变量
    用来记录第一个元素
     
    加油
  • 相关阅读:
    bzoj 3122 [Sdoi2013]随机数生成器(逆元,BSGS)
    归并排序
    MS-coco数据集下载及使用(转)
    转-深度学习视觉领域常用数据集汇总
    opencv-Mat数据类型及位数总结
    opencv-图像类型、深度、通道
    opencv-VS2010配置opencv2.4.8
    opencv-访问Mat中每个像素的值
    VS2010文件包含
    转载: 8个月从CS菜鸟到拿到Google Offer的经历+内推
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10296663.html
Copyright © 2011-2022 走看看