geam1113’s diary

主にAtcoderのコンテストの備忘録を書きます。AtCoder緑と水色を行ったり来たりしています。

ABC243 参加記録

コンテスト中AC:A〜D

D - Moves on Binary Tree

公式解説の解法1とほぼ同じでした。

まず、根からXへの移動方法の文字列Tを得ます。具体的には、

Xが1となるまで以下を行う。

Tの末尾に、Xが偶数なら'L'を、奇数なら'R'を追加。
X\leftarrow \lfloor \frac{X}{2}\rfloorと更新。

上記が終了したら、Tを反転させる。

その後、i=1,2,...,Nについて、以下を行います。

S_i'U'なら、Tの末尾から文字を一つ取り除く。
そうでないなら、S_iTの末尾に追加。

これによって、Tは根から答えのノードまでの移動方法の文字列となります。あとはこれに従って、根(番号1)から計算していけば良いです。

計算量は、Xまでの文字列の大きさがlogXで、最終的なTの大きさもlog(10^{18})を超えないことから、O(N)だと思います。

提出コード

書いていて気づきましたが、最終的にT'U'を含まないので、答えの番号を求めるときの分岐は不要でした。

解法2の考え方も思いついたのですが、ビットシフトしなければいけないと思い断念しました。
単純に末尾に末尾への追加・削除だけで良いことを思いつけなかったです。