1. 程式人生 > 其它 >洛谷 P1160 佇列安排

洛谷 P1160 佇列安排

題目描述

一個學校里老師要將班上NN個同學排成一列,同學被編號為1\sim N1N,他採取如下的方法:

  1. 先將11號同學安排進佇列,這時佇列中只有他一個人;

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

  3. 從佇列中去掉M(M<N)M(M<N)個同學,其他同學位置順序不變。

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

輸入格式

11行為一個正整數NN,表示了有NN個同學。

2-N2N行,第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個空格隔開的正整數,表示了佇列從左到右所有同學的編號,行末換行且無空格。

輸入輸出樣例

輸入 #1
4
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; }