P1160 佇列安排

2021-09-27 04:26:24 字數 2858 閱讀 7114

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

先將1

11號同學安排進佇列,這時佇列中只有他乙個人;

2 −n

2-n2−

n號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為1∼(

i−1)

1\sim (i -1)

1∼(i−1

)中某位同學(即之前已經入列的同學)的左邊或右邊;

從佇列中去掉m(m

m(mm(

m個同學,其他同學位置順序不變。

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

第1

11行為乙個正整數n

nn,表示了有n

nn個同學。

第2 −n

2-n2−

n行,第i

ii行包含兩個整數k,p

k,pk,

p,其中k

kk為小於i

ii的正整數,p

pp為0

00或者1

11。若p

pp為0

00,則表示將i

ii號同學插入到k

kk號同學的左邊,p

pp為1

11則表示插入到右邊。

第n +1

n+1n+

1行為乙個正整數m

mm,表示去掉的同學數目。

接下來m

mm行,每行乙個正整數x

xx,表示將x

xx號同學從佇列中移去,如果x

xx號同學已經不在佇列中則忽略這一條指令。

第1

11行,包含最多n

nn個空格隔開的正整數,表示了佇列從左到右所有同學的編號,行末換行且無空格。

4

1 02 1

1 02

33

2 4 1

樣例解釋:

將同學2

22插入至同學1

11左邊,此時隊列為:

21

2 121

將同學3

33插入至同學2

22右邊,此時隊列為:

231

2 3 1

231

將同學4

44插入至同學1

11左邊,此時隊列為:

2341

2 3 4 1

2341

將同學3

33從佇列中移出,此時隊列為:

241

2 4 1

241

同學3

33已經不在佇列中,忽略最後一條指令

最終佇列:

241

2 4 1

241

資料範圍

對於20

%20\%

20%的資料,有n≤10

n≤10

n≤10

;對於40

%40\%

40%的資料,有n

≤1000

n≤1000

n≤1000

;對於100

%100\%

100%

的資料,有n,m

≤100000

n, m≤100000

n,m≤10

0000

。開始用的單向列表,發現雙向也可以。但這都會超時。

複雜度可能為o(n*n),找到資料n,操作可以忽略,共n次。

時間浪費在了查詢上面。

那我們開個陣列,把每個編號同學對號入座,儲存他的左右編號。

需要的時候,直接把他拉過來即可。

附上tle**

#include#include#includeusing namespace std;

struct node ;

int read()

void add(int i,int p1,int k,node *head) else

return;

} am=tep;

tep=tep->next; }}

void del(int p1,node *head)

am=tep;

tep=tep->next; }

}node* build()

void print(node *head)

}int main(void)

int m;

m=read();

for(int i=1;i<=m;i++)

print(head);

}

pe[0]相當於頭結點,不然你去**找第一人。

第一次用陣列模擬鍊錶,感覺有點新鮮呀。

#include#include#includeusing namespace std;

struct node ;

node pe[100003];

int read()

void add(int i,int p1,int k)

else }

void del(int p1)

node build()

void print()

} else break;

tep=pe[tep].next; }}

int main(void)

int m;

m=read();

for(int i=1;i<=m;i++)

print();

}

P1160 佇列安排

p1160 佇列安排 昨天下午看了一下,感覺肯定要用vector或者佇列,想著自己用的不怎麼好,就沒寫,然後晚上睡不著的時候想到了這題,突然就想到解題辦法了,要不是太晚了我就起床寫了,今天寫了一遍就ac了,哈哈哈 這題比較好玩吧。定義乙個二維陣列,每個數的左右兩個數分別用第二維的陣列0和1存,進行操...

P1160 佇列安排

乙個學校裡老師要將班上n個同學排成一列,同學被編號為1 n,他採取如下的方法 1.先將1號同學安排進佇列,這時佇列中只有他乙個人 2.2 n號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為1 i 1中某位同學 即之前已經入列的同學 的左邊或右邊 3.從佇列中去掉m m在所有...

P1160 佇列安排

題目鏈結 很裸的一道佇列的題 方法一 沒審清題目,直接就來寫,笨笨得每次都掃瞄一遍鍊錶導致tle,最後得分40分 1 include2 using namespace std 3int n,k,p,m,x 4struct lb 9 lb l 100010 10 int tail 1 隊尾計數 11i...