1. 程式人生 > 其它 >ICPC 2019 World Final H. Hobsons' trains

ICPC 2019 World Final H. Hobsons' trains

題目連結
對於有向圖,首先考慮bfs拓撲,然後就剩下一些環。由於題目中每個點只有一條出邊,故剩下的是一些簡單環,所以整個圖就可以化為一些有向基環樹(森林)。
然後考慮計算答案,對於環上的點,考慮該基環樹內每個點都可以貢獻環上的一個區間,於是直接查分後做字首和即可。對於樹上的點,答案即為子樹內與自身距離不超過k的點的個數。比較直觀的做法是線段樹合併(本來以為可以長剖,然而要算字首和),但感覺空間開不下,考場(VP)上糊了一個按照dfs序和深度兩個偏序用主席樹的做法,寫得亂七八糟的之後才調過。。。(其實時空複雜度都要nlogn,依然很不優美)
對於樹上的點,我們不考慮直接計算其子樹內的答案,而是仍然像環上的點那樣,考慮每個點的貢獻,那麼會發現其貢獻到往上的長度為k的鏈上(可以直接樹剖),這時候再做一個差分,對鏈頂的父親-1,鏈底+1,然後查詢每個點的子樹和即為答案,用dfs序離線查詢區間和即可,時空複雜度都是O(n)的。
所以其實按照環上的點的思路計算樹上的點就很簡單了,原本還想了各種資料結構,還是VP的時候降智了吧。
一些錯誤點
1.有向圖區分樹邊和環邊只需要bfs拓撲,不需要tarjan(即使寫了tarjan也要記得訪問完一個點要退棧!)
2.注意是有向圖,環也是有向的!