題目連結

https://zerojudge.tw/ShowProblem?problemid=a249

https://onlinejudge.org/index.php?option=com_onlinejudge&Itemid=8&page=show_problem&problem=620

參考文章

我是 c++ 新手,需要參考文章

C++基礎語法介紹 - HackMD

本題要點

解一是在平板上畫圖想出來的方法

先建立一個 LR 陣列來紀錄路徑

判斷 L 節點(掉落位置)是在 L 父節點的左邊還右邊

左邊就在 LR 陣列當中紀錄為 0,右邊則是 1

一路往回找到根節點後就可以知道從根節點到掉落位置的路徑(ex.左左右左右…)

這裡要特別注意 LR 的方向

我們是從掉落位置紀錄回根節點,所以從根節點往掉落位置推的時候要將 LR 翻轉

於是從根節點 1 開始,往左就將當前節點 cur * 2,往右就將當前節點 (cur *2) + 1

看到超時後就去看了別人的解題紀錄,發現了更快的解法

解二是用除以 2 的餘數來判斷從根部開始的左右邊

奇數是左半,偶數是右半,一直向下劃分直到掉落點(最深)