[ABC225] D - Play Train

[Q] https://atcoder.jp/contests/abc225/tasks/abc225_d

どの電車も、連結が1つしかないルールがとても親切でした。

1. 行のグラフG、戻りのグラフR を作成しますが、要素は1個しかもたないようです。
2. クエリ[3] がきたら、今いる電車からまず先頭を見に行く(R)。
dequeでpush_front()する。
3. お尻まで見る(G)。
dequeでpush_back()する。

Q. 
7 14
1 6 3
1 4 1
1 5 2
1 2 7
1 3 5
3 2
3 4
3 6
2 3 5
2 4 1
1 1 5
3 2
3 4
3 6

1) 1 6 3
G[6] = {3}
R[3] = {6}

2) 1 4 1
G[4] = {1}
R[1] = {4}

...

6) 3 2
・先頭までを調べる。
R[2] = 5
R[5] = 3
R[3] = 6

・おしりまでを調べる。
G[2] = 7

A. 6 3 5 2 7

実装

vector<ll> G[100010];
vector<ll> R[100010];


void dfs1(ll v, deque<ll> &ans){
 for(auto u: G[v]){
   ans.push_back(u);
   dfs1(u, ans);
 }
}

void dfs2(ll v, deque<ll> &ans){
 for(auto u: R[v]){
   ans.push_front(u);
   dfs2(u, ans);
 }
}

int main(){
 cincout();
 
 ll N, Q;
 cin >> N >> Q;
 rep(i, Q){
   ll a, x, y;
   cin >> a >> x;
   if (a==1){
     cin >> y;
     G[x].push_back(y);
     R[y].push_back(x);
   }
   else if (a==2){
     cin >> y;
     G[x].erase(G[x].begin()); // どうせ1個しか入ってない
     R[y].erase(R[y].begin());
   }
   else if (a==3){
     deque<ll> ans;
     ans.push_back(x);
     dfs1(x, ans);
     dfs2(x, ans);
     cout << ans.size() << " ";
     while (!ans.empty()){
       cout << ans.front(); ans.pop_front();
       if (!ans.empty()) cout << " ";
       else cout << endl;
     }
   }
 }
}

https://atcoder.jp/contests/abc225/submissions/26905426


いいなと思ったら応援しよう!