洛谷 P1160 佇列安排
阿新 • • 發佈:2021-11-21
題目描述
一個學校里老師要將班上NN個同學排成一列,同學被編號為1\sim N1∼N,他採取如下的方法:
-
先將11號同學安排進佇列,這時佇列中只有他一個人;
-
2-N2−N號同學依次入列,編號為i的同學入列方式為:老師指定編號為i的同學站在編號為1\sim (i -1)1∼(i−1)中某位同學(即之前已經入列的同學)的左邊或右邊;
-
從佇列中去掉M(M<N)M(M<N)個同學,其他同學位置順序不變。
在所有同學按照上述方法佇列排列完畢後,老師想知道從左到右所有同學的編號。
輸入格式
第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個空格隔開的正整數,表示了佇列從左到右所有同學的編號,行末換行且無空格。
輸入輸出樣例
輸入 #14 1 0 2 1 1 0 2 3 3
輸出 #1
2 4 1
分析
stl list 練習
程式碼
#include<bits/stdc++.h>
using namespace std;
const int max_N = 1e5+10;
list <int > List;
int N;
list<int>::iterator pos[max_N];
bool er[max_N];
int main()
{
cin>>N;
List.push_back(1);
pos[1]=List.begin();
for(int i=2;i<=N;i++)
{
int k,p;
cin>>k>>p;
if(p==0)
{
pos[i]=List.insert(pos[k],i);// 返還i位置指標 *插入同學時前面已經有此人
}
else if(p==1)
{
pos[i]=List.insert(next(pos[k],1),i);
}
}
int M;
cin>>M;
for(int i=1;i<=M;i++)
{
int k;
cin>>k;
if(er[k]) continue;//不在此隊中
List.erase(pos[k]);
er[k]=true;
}
list<int>::iterator it;
for(it=List.begin();it!=List.end();++it)
{
cout<<*it<<" ";
}
return 0;
}