傳送門
乙個學校裡老師要將班上\(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存,進行操...