洛谷 P1160 佇列安排

2022-03-20 06:09:44 字數 1623 閱讀 4710

洛谷傳送門

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

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

2-n2−n號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為1\sim (i -1)1∼(i−1)中某位同學(即之前已經入列的同學)的左邊或右邊;

從佇列中去掉m(mm(m

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

第11行為乙個正整數nn,表示了有nn個同學。

第2-n2−n行,第ii行包含兩個整數k,pk,p,其中kk為小於ii的正整數,pp為00或者11。若pp為00,則表示將ii號同學插入到kk號同學的左邊,pp為11則表示插入到右邊。

第n+1n+1行為乙個正整數mm,表示去掉的同學數目。

接下來mm行,每行乙個正整數xx,表示將xx號同學從佇列中移去,如果xx號同學已經不在佇列中則忽略這一條指令。

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

輸入 #1複製

輸出 #1複製

樣例解釋:

將同學22插入至同學11左邊,此時隊列為:

2 121

將同學33插入至同學22右邊,此時隊列為:

2 3 1231

將同學44插入至同學11左邊,此時隊列為:

2 3 4 12341

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

2 4 1241

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

最終佇列:

2 4 1241

資料範圍

對於20%20%的資料,有n≤10n≤10;

對於40%40%的資料,有n≤1000n≤1000;

對於100%100%的資料,有n, m≤100000n,m≤100000。

我們非常容易得出,這道題的大意就是在乙個數列裡進行大量的隨機插入和隨機刪除操作,一看就是一道資料結構的題目。

那麼用什麼資料結構呢?

佇列?肯定不行,佇列不支援隨機插入和刪除。

陣列?那不扯呢麼

棧?(狗屁)

我們找遍所有容器,發現根本沒有支援隨機插入和刪除的。

鍊錶是一種支援隨機插入和隨機刪除的資料結構。

鍊錶部落格

所以我們發現這道題一下子就變成了一道鍊錶資料結構的裸題。

套用陣列模擬鍊錶進行ac操作即可。

**:

#includeusing namespace std;

int n,m;

struct node

a[100010];

void init()

void insert_left(int pos,int k)

void insert_right(int pos,int k)

void remove(int x)

void print()

}int main()

scanf("%d",&m);

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

print();

return 0;

}

洛谷 P1160 佇列安排

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

洛谷P1160 佇列安排

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

洛谷P1160 佇列安排

乙個學校裡老師要將班上nn個同學排成一列,同學被編號為1 sim n1 n,他採取如下的方法 先將11號同學安排進佇列,這時佇列中只有他乙個人 2 n2 n號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為1 sim i 1 1 i 1 中某位同學 即之前已經入列的同學 的左...