乙個學校裡老師要將班上n個同學排成一列,同學被編號為1∼n,他採取如下的方法:
先將1號同學安排進佇列,這時佇列中只有他乙個人;
2−n號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為1∼(i−1)中某位同學(即之前已經入列的同學)的左邊或右邊;
從佇列中去掉m(m在所有同學按照上述方法佇列排列完畢後,老師想知道從左到右所有同學的編號。
第1行為乙個正整數n,表示了有n個同學。
第2−n行,第ii行包含兩個整數k,p,其中k為小於ii的正整數,p為0或者1。若p為0,則表示將i號同學插入到k號同學的左邊,p為1則表示插入到右邊。
第n+1行為乙個正整數m,表示去掉的同學數目。
接下來m行,每行乙個正整數x,表示將x號同學從佇列中移去,如果x號同學已經不在佇列中則忽略這一條指令。
1行,包含最多n個空格隔開的正整數,表示了佇列從左到右所有同學的編號,行末換行且無空格。
輸入 #1
41 0
2 11 023
3輸出 #1
2 4 1
樣例解釋:
將同學2插入至同學1左邊,此時隊列為:
21將同學3插入至同學2右邊,此時隊列為:
231將同學4插入至同學1左邊,此時隊列為:
2341
將同學3從佇列中移出,此時隊列為:
241同學3已經不在佇列中,忽略最後一條指令
最終佇列:
241對於20%的資料,有n≤10;
對於40%的資料,有n≤1000;
對於100%的資料,有n,m≤100000。
我是信了洛谷演算法標籤的邪,我居然真的模擬了佇列結構,被find()坑死,所以也理所當然的tle了三個點。
#include
using
namespace std;
intmain()
int m;
cin >> m;
for(
int i =
0; i < m; i++
)for
(int i =
0; a.
begin()
+ i != a.
end(
); i++
) cout << a[i]
<<
" ";
return0;
}
聽題解區dalao說單鏈表會超時,但雙向鍊錶不會,所以我就去用了雙向鍊錶,結果tle得我腦闊疼(我還是太天真了 ),逼得我加了兩層優化,也就是乙個used陣列還有乙個better陣列,better陣列是後來加的也是重點,所以我覺得used陣列可以刪掉,你要是看到這段話的話可以試著刪掉used 陣列的相關操作,這樣**也簡潔些~
#include
using
namespace std;
int used[
100001];
//優化刪除過程中的查詢
class
node
;node* better[
100001];
//優化整體查詢過程
node* head =
new node;
node*
search
(int k)
//查詢元素
return nullptr;*/
return better[k];}
intmain()
else
}else
//插入右側
else
} better[i]
= q;
}int m;
cin >> m;
for(
int i =
0; i < m; i++
)else
temp-
>front-
>next =
nullptr
;else
head = head-
>next;
used[k]=0
; better[k]
=nullptr;}
} node* p = head;
while
(p)return0;
}
P1160 佇列安排 雙向鍊錶
題目描述 乙個學校裡老師要將班上nnn個同學排成一列,同學被編號為1 n1 sim n1 n,他採取如下的方法 先將111號同學安排進佇列,這時佇列中只有他乙個人 2 n2 n2 n號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為1 i 1 1 sim i 1 1 i 1 ...
P1160 佇列安排 鍊錶
評測記錄 有 n n 個人,編號是1 n role presentation 1 n 1 n,然後開始時插入第乙個人,之後每次可以插入到乙個人的左邊或右邊,然後去掉 m m 個人,最後輸出佇列順序。裸的鍊錶題 插入操作 if c else 刪除操作 node node x prev next nod...
P1160 佇列安排
乙個學校裡老師要將班上n個同學排成一列,同學被編號為1 n,他採取如下的方法 先將1 11號同學安排進佇列,這時佇列中只有他乙個人 2 n 2 n2 n號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為1 i 1 1 sim i 1 1 i 1 中某位同學 即之前已經入列的同...