P1160 佇列安排

自為風月馬前卒發表於2017-06-17

題目描述

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

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

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

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

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

輸入輸出格式

輸入格式:

輸入檔案arrange.in的第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號同學已經不在佇列中則忽略這一條指令。

輸出格式:

輸入檔案arrange.out僅包括1行,包含最多N個空格隔開的正整數,表示了佇列從左到右所有同學的編號,行末換行且無空格。

輸入輸出樣例

輸入樣例#1:
4
1 0
2 1
1 0
2
3
3
輸出樣例#1:
2 4 1

將同學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。

 

標籤是佇列但是正解是連結串列。。

思路比較清晰,就是個連結串列。

但是邏輯可能稍微有點複雜

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 using namespace std;
 6 int read(int & n)
 7 {
 8     char c='-';int x=0;
 9     while(c<'0'||c>'9')c=getchar();
10     while(c>='0'&&c<='9')
11     {
12         x=x*10+(c-48);
13         c=getchar();
14     }
15     n=x;
16 }
17 const int MAXN=100001;
18 struct node
19 {
20     int pre,nxt,pos,flag;
21 }s[MAXN];
22 int n,m,where,how;
23 int main()
24 {
25     read(n);
26     for(int i=1;i<=n;i++)
27     {
28         s[i].flag=1;// 一開始肯定都會出現 
29         s[i].pos=0;
30         s[i].pre=0;
31         s[i].nxt=0;
32     }
33         s[1].pos=1;
34     for(int i=2;i<=n;i++)
35     {
36         read(where);// 目標同學 
37         read(how);
38         if(how==0)// 左邊 
39         {
40             s[s[where].pre].nxt=i;
41             s[i].pre=s[where].pre;
42             s[where].pre=i;
43             s[i].nxt=where;
44             if(s[where].pos==1)
45             {
46                 s[where].pos=0;
47                 s[i].pos=1;
48             }
49         }
50         else
51         {
52             s[s[where].nxt].pre=i;
53             s[i].nxt=s[where].nxt;
54             s[where].nxt=i;
55             s[i].pre=where;
56             
57         }
58     }
59 
60     read(m);
61     for(int i=1;i<=m;i++)
62     {
63         read(where);
64         if(s[where].flag==0)continue;
65         if(s[where].pos==1)
66             s[s[where].nxt].pos=1;
67         s[where].flag=0;
68         s[s[where].pre].nxt=s[where].nxt;
69         s[s[where].nxt].pre=s[where].pre;
70     }
71     for(int i=1;i<=n;i++)
72     {
73         if(s[i].pos==1)
74         {
75             printf("%d ",i);
76             int p=s[i].nxt;
77             while(p!=0)
78             {
79                 printf("%d ",p);
80                 p=s[p].nxt;
81             }
82         }
83     }
84     return 0;
85 }

 

相關文章