乙個學校裡老師要將班上n個同學排成一列,同學被編號為1~n,他採取如下的方法:
1.先將1號同學安排進佇列,這時佇列中只有他乙個人;
2.2~n號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為1~i -1中某位同學(即之前已經入列的同學)的左邊或右邊;
3.從佇列中去掉m(m在所有同學按照上述方法佇列排列完畢後,老師想知道從左到右所有同學的編號。
輸入格式:
輸入檔案arrange.in的第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號同學已經不在佇列中則忽略這一條指令。
輸出格式:
輸入檔案arrange.out僅包括1行,包含最多n個空格隔開的正整數,表示了佇列從左到右所有同學的編號,行末換行且無空格。
輸入樣例#1:
複製
41 02 1
1 02
33
輸出樣例#1:
複製
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。
參考題解:
stl講的很到位
#include#includeusing namespace std;
using iter = list::iterator;
const int maxn = 1e5 + 5;
iter pos[maxn];//用來儲存迭代器的陣列
listmylist;//雙向鍊錶stl
bool vis[maxn];//訪問陣列,用於刪除的時候
int main()
else//插在k的右邊
}//開始刪除
int m;
cin >> m;
for (int i = 1; i <= m; i++)
//開始輸出元素
list::iterator iter;
iter = mylist.begin();
for (; iter != mylist.end(); iter++)
return 0;
}
洛谷 P1160 佇列安排
題目描述 乙個學校裡老師要將班上n個同學排成一列,同學被編號為1 n,他採取如下的方法 1.先將1號同學安排進佇列,這時佇列中只有他乙個人 2.2 n號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為1 i 1中某位同學 即之前已經入列的同學 的左邊或右邊 3.從佇列中去掉m...
洛谷P1160 佇列安排
乙個學校裡老師要將班上nn個同學排成一列,同學被編號為1 sim n1 n,他採取如下的方法 先將11號同學安排進佇列,這時佇列中只有他乙個人 2 n2 n號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為1 sim i 1 1 i 1 中某位同學 即之前已經入列的同學 的左...
洛谷 P1160 佇列安排
題目描述 乙個學校裡老師要將班上nn個同學排成一列,同學被編號為1 sim n1 n,他採取如下的方法 先將11號同學安排進佇列,這時佇列中只有他乙個人 2 n2 n號同學依次入列,編號為i的同學入列方式為 老師指定編號為i的同學站在編號為1 sim i 1 1 i 1 中某位同學 即之前已經入列的...