zoukankan      html  css  js  c++  java
  • [FZYZOJ 1604] [NOIP福建夏令营]队列安排

    P1604 -- [NOIP福建夏令营]队列安排

    时间限制:1000MS

    内存限制:131072KB

    Description

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

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

    2.2~N号同学依次入列,编号为i的同学入列方式为:老师指定编号为i的同学站在编号为1~i -1中某位同学(即之前已经入列的同学)的左边或右边;

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

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

    Input Format

    输入的第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号同学已经不在队列中则忽略这一条指令。

    Output Format

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

    Sample Input

    4
    1 0
    2 1
    1 0
    2
    3
    3

    Sample Output

    2 4 1

    Hint

    【样例说明】

    将同学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。

    【题解】水题呀,双向链表……

    然而我却WA了无数次,我也找不出为什么

    后来我又重新写了一份代码竟然就AC了。。

    灵异现象=-=

     1 #include<bits/stdc++.h>
     2 using namespace std;
     3 int next[100010],last[100010],n,m;
     4 int main() {
     5     scanf("%d",&n);
     6     next[0]=1;
     7     last[1]=0;
     8     next[1]=n+1;
     9     for (int i=2;i<=n;++i) {
    10         int k,p;
    11         scanf("%d%d",&k,&p);
    12         if(p==0) {
    13             last[i]=last[k];
    14             next[last[k]]=i;
    15             next[i]=k;
    16             last[k]=i;
    17         }
    18         if(p==1) {
    19             next[i]=next[k];
    20             last[next[k]]=i;
    21             last[i]=k;
    22             next[k]=i;
    23         }
    24     }
    25     scanf("%d",&m);
    26     for (int i=1;i<=m;++i) {
    27         int num;
    28         scanf("%d",&num);
    29         if (last[num]==-1) continue;
    30         last[next[num]]=last[num];
    31         next[last[num]]=next[num];
    32         last[num]=-1;
    33     }
    34     for (int i=next[0];i!=n+1;i=next[i]) printf("%d ",i);
    35     printf("
    ");
    36     return 0;
    37 }
    View Code
    这篇文章由TonyFang发布。 所有解释权归TonyFang所有。 Mailto: tony-fang@map-le.net
  • 相关阅读:
    leetcode 347. Top K Frequent Elements
    581. Shortest Unsorted Continuous Subarray
    leetcode 3. Longest Substring Without Repeating Characters
    leetcode 217. Contains Duplicate、219. Contains Duplicate II、220. Contains Duplicate、287. Find the Duplicate Number 、442. Find All Duplicates in an Array 、448. Find All Numbers Disappeared in an Array
    leetcode 461. Hamming Distance
    leetcode 19. Remove Nth Node From End of List
    leetcode 100. Same Tree、101. Symmetric Tree
    leetcode 171. Excel Sheet Column Number
    leetcode 242. Valid Anagram
    leetcode 326. Power of Three
  • 原文地址:https://www.cnblogs.com/TonyNeal/p/fzyzoj1604.html
Copyright © 2011-2022 走看看