CF1006E - Military Problem(搜尋技術+圖論+樹/省選級)
阿新 • • 發佈:2021-12-22
【2021.12.15】隊內賽第三題
【2021.12.21】補題
CF1006E - Military Problem(源地址自⇔CF1006E)
目錄Problem
tag
⇔搜尋技術、⇔圖論、⇔樹、⇔省選級(*1600)
題意
軍隊傳遞訊息依照某種規律,如下:
- 訊息的傳遞總是以樹的形式,從上級層層下傳,傳遞到下級。
- 對於同一級的人員,編號越小的士兵越早被傳遞訊息。
現在,某個上級 \(u\) 試圖將訊息傳遞到他的第 \(v\) 個下級處,請你判斷這個下級是誰。
思路
(朱老師)
非常簡單的樹形搜尋。
(隊內賽自己)
建樹,然後使用搜索技術得出這棵樹的DFS序和每個士兵的下級數量。
- 先判斷第 \(v\) 個下級是否存在(與子節點數量比較)。
- 若存在,在DFS序中找到 \(u\) ,那麼 \(u\) 之後的第 \(v-1\) 個士兵即為答案。
AC程式碼(虛擬碼)
void dfs(int x) { a[++ m] = x;//a陣列儲存DFS序 flag[x] = m; siz[x] = 1;//子節點統計陣列(包含它自己) For(i, V[x]) { dfs(i); siz[x] += siz[i]; } } void solve() { cin >> n >> q; FOR(i, 2, n) { cin >> x; V[x].push_back(i); } dfs(1); FOR(i, 1, q) { cin >> x >> y; if(siz[x] < y) P(-1); else P(a[flag[x] + y - 1]); } }
錯誤次數
(隊內賽1、2,補題1)誤以為DFS序的第 \(u\) 個元素就是上級 \(u\) ,導致直接計算。
文 / WIDA
2021.12.21 成文
首發於WIDA個人部落格,僅供學習討論
更新日記:
2021.12.21 成文