- Quiz
- AC
- 解説
- editorialがないので書いておこうと思ったが、実装問題です。特殊なデータ構造は不要
- 左右の情報が与えられるので、各数字の右と左を答えられるようにしておく
- サンプルでいうと左端集合は6,3,5なので「6から始まるリスト」+「3から始まるリスト」+「5から始まるリスト」と連結すればいい
int main(){
cin.tie(0);
ios::sync_with_stdio(false);
ll N;
cin>>N;
VI from(N,-1);
VI to(N,-1);
rep(i,N){
ll l,r;cin>>l>>r;
l--;r--;
if(l!=-1){
from[i]=l;
}
if(r!=-1){
to[i]=r;
}
}
VI lefts;
rep(i,N){
if(from[i]==-1)lefts.push_back(i);
}
VI A;
for(ll left : lefts){
A.push_back(left);
while(to[A.back()]!=-1){
ll nxt = to[A.back()];
A.push_back(nxt);
}
}
VI I(N);
rep(i,N){
ll a = A[i];
I[a]=i;
}
rep(a,N){
ll idx = I[a];
ll left=-1;
ll right=-1;
if(idx)left=A[idx-1];
if(idx<N-1)right=A[idx+1];
p2(left+1,right+1);
}
return 0;
}