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;
    }
    ----------------------------------------------------------------------------------------------
     
    希望下次记得
    设一个变量
    用来记录第一个元素
     
    加油
  • 相关阅读:
    平衡树(Splay):Splaytree POJ 3580 SuperMemo
    数据结构:(平衡树,链表)BZOJ 1588[HNOI2002]营业额统计
    主席树:HDU 4417 Super Mario
    主席树:POJ2104 K-th Number (主席树模板题)
    后缀数组模板
    后缀数组:HDU1043 Longest Common Substring
    后缀数组:SPOJ SUBST1
    关于PHP程序员解决问题的能力
    现在写 PHP,你应该知道这些
    PHP 7 的几个新特性
  • 原文地址:https://www.cnblogs.com/darlingroot/p/10296663.html
Copyright © 2011-2022 走看看