1. 程式人生 > >CF750F New Year and Finding Roots 構造+樹論

CF750F New Year and Finding Roots 構造+樹論

一個 mar www 一次 fin 怎麽 思考 祖先 ash

正解:構造

解題報告:

傳送門!

交互題交互題!哇好新鮮啊QwQ

首先考慮最傻逼的做法,應該是每個人都能想到的

首先看一下它給的條件,考慮到完全二叉樹的性質,就可以發現,如果給的鄰居只有一個,說明是葉子,有兩個,說明是根,有三個,說明是普通的節點

然後就分情況討論鴨(以下內容都是從最差的情況即h=7為基礎的討論

如果運氣好,問到了根,得嘞那就不用再問辣ans出來辣

如果問到了一個葉子節點,那就會給一個非根非葉子節點,就繼續詢問這個普通節點

如果問到了一個普通節點,就會有三個鄰居,那就依次選,並利用已知條件優化一下

具體怎麽做我就不說辣反正就是枚舉一通+所有人都想得到的優化

說一下正解趴

首先可以想到,假如給一條鏈,鏈的一端是葉子節點,那麽這條鏈上每個節點的深度都能知道了是趴

那假如我們第一次問,問到了一個普通節點,現在要求它的深度,怎麽求呢

隨便問兩條鏈,從三個鄰居中選出倆然後一條路問到黑的那種,經過節點數比較少的那條一定是經過它的兒子的筆直向下的一條鏈(如果相等就都是)(不理解的可以畫下圖很快就能get辣

同時我們還可以知道三個鄰居中哪個是它爹哪些是它崽

然後我們就能get一個構造方法

隨機一個點,按照上面的方法求出它的深度

        ↓

找到當前已知深度最低的點

↓          ↑

隨機一條鏈,更新當前點祖先的深度,回到操作2

就這麽一直做做做下去就能保證一直往上就能找到根節點了嘛

但是繼續思考

當h=7的時候,假如運氣有這——麽背,當詢問到深度=2的時候(規定根節點深度為1),如果選一條鏈通向葉子節點,就要問5次,就會要超過辣

但是考慮,當深度=2的時候,我們未知的鄰居節點只有兩個,一定有一個是根,所以只要問1次就出來了,問5次肯定虧辣

當深度=3的時候一樣,具體不剖析了反正一樣是,打破砂鍋問到底就很虧不如直接問

最後通過一系列計算可以發現當最慘的情況下也只用問17次,但是第17次問到的一定是樹根,所以其實只要問16次,就剛好!

over!

等下放代碼QwQ!

CF750F New Year and Finding Roots 構造+樹論