1. 程式人生 > >洛谷 P1160 隊列安排

洛谷 P1160 隊列安排

UNC region -s %20 隊列 std bool 所有 include

題目描述

一個學校裏老師要將班上 NNN 個同學排成一列,同學被編號為 $1~N$ ,他采取如下的方法:

  1. 先將 111 號同學安排進隊列,這時隊列中只有他一個人;

  2. 2?N2-N2?N 號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為 1?(i?1)1-(i -1)1?(i?1) 中某位同學(即之前已經入列的同學)的左邊或右邊;

3.從隊列中去掉 M(M<N)M(M<N)M(M<N) 個同學,其他同學位置順序不變。

在所有同學按照上述方法隊列排列完畢後,老師想知道從左到右所有同學的編號。

輸入輸出格式

輸入格式:

111 行為一個正整數 NNN ,表示了有 NNN 個同學。

2?N2-N2?N 行,第 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 。

就是一個基礎鏈表,挺簡單的。

 1 #include<iostream>
 2 #include<cstdio>
 3 using namespace std;
 4 const int N=100005;
 5 int n,m;
 6 bool b[N];
 7 struct node
 8 {
 9     int l,r;
10 }a[N];
11 void ins(int x,int y,int d)
12 {
13     if(d==0)
14         a[x].l=a[y].l,a[x].r=y,a[a[y].l].r=x,a[y].l=x;
15     else
16         a[x].r=a[y].r,a[x].l=y,a[a[y].r].l=x,a[y].r=x;
17 }
18 int main()
19 {
20     scanf("%d",&n);
21     for(int i=1;i<=n;i++)
22         a[i].l=a[i].r=-1;
23     a[1].l=0,a[1].r=n+1;
24     for(int i=2;i<=n;i++)
25     {
26         int k,p;
27         scanf("%d%d",&k,&p);
28         ins(i,k,p);
29     }
30     scanf("%d",&m);
31     while(m--)
32     {
33         int x;
34         scanf("%d",&x);
35         if(!b[x])
36         {
37             b[x]=1;
38             a[a[x].l].r=a[x].r;
39             a[a[x].r].l=a[x].l;
40             a[x].l=a[x].r=-1;
41         }
42     }
43     for(int i=1;i<=n;i++)
44         if(!b[i]&&a[i].l==0)
45         {
46             int t=i;
47             printf("%d ",t);
48             while(a[t].r!=n+1)
49             {
50                 t=a[t].r;
51                 printf("%d ",t);
52             }
53             printf("\n");
54         }
55     return 0;
56 }

洛谷 P1160 隊列安排