luogu p1160 佇列安排

2022-02-15 12:08:52 字數 2572 閱讀 1664

傳送門

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

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

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

從佇列中去掉\(m(m個同學,其他同學位置順序不變。

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

第\(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\)號同學已經不在佇列中則忽略這一條指令。

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

4

1 02 1

1 02

33

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\)。

這道題啊,赤裸裸的鍊錶。我們直接實現乙個雙向鍊錶就好了。這裡使用陣列實現雙向鍊錶。

我們先定義乙個node節點:

struct node l[100005];
然後初始化這個鍊錶。

void initlist(int n)
可以看到,我們把下標為0作為雙向鍊錶的開始。這可以避免一些問題。

接下來定義addleft函式,在pos位置的左邊新增數x。這就是雙向鍊錶的板子了,具體見注釋。

void addleft(int x, int pos)
addright函式同理。

void addright(int x, int pos)
那麼怎麼刪除呢?很簡單,我們將要刪除的節點x的兩邊都設為-1,然後原來兩邊的節點中,左邊的和右邊的跳過節點x直接link together

void deletenode(int x) 

return ;

}

最後是遍歷。由於我們是從下標為0開始的,從0開始遍歷當前節點的右節點就好了,一直到-1

void printlist() 

return ;

}

完整**如下:

/*

* @author: crab-in-the-northeast

* @date: 2020-03-07 10:37:45

* @last modified by: crab-in-the-northeast

* @last modified time: 2020-03-07 12:16:14

*/#include #include struct node l[100005];

void initlist(int n)

void addleft(int x, int pos)

void addright(int x, int pos)

void deletenode(int x)

return ;

}void printlist()

return ;

}int main()

int m;

scanf("%d",&m);

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

printlist();

return 0;

}

ac 100:r31453533

Luogu P1160 佇列安排

其實鍊錶很早就學過了,但我當時的寫法侷限於陣列模擬,沒有考慮過指標實現 好吧其實當時也就不知道指標這個玩意 但今天突然有人在qq上問我 為什麼用指標實現的鍊錶居然會超時 luogu p1160 佇列安排 然而這個題用陣列模擬就可以過了。於是我copy了一下她的源 hljs haskell inclu...

P1160 佇列安排

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

P1160 佇列安排

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