題目大意
有一棵\(n\)(\(n\leq10^5\))個點的樹,每個點\(i\)有顏色\(c_i\)(\(c_i\leq10^5\))
定義一條路徑的得分為這條路徑上的不同顏色個數
分別求每個點的以該點出發的所有路徑的得分總和
題解統計和路徑有關的東西,讓人想到點分治
找到當前區域的重心後,計算所有過重心的路徑的影響
記每個當前區域裡的點\(i\)以重心為根時,當前區域裡的子樹大小為\(siz_i\)
先分別算出每個顏色\(i\),對「從重心出發的所有路徑的得分總和」的貢獻\(w_i\)
發現如果乙個點\(i\)的顏色\(c_i\)是從重心到它的路徑上第一次出現的,那麼它對於每條「以重心為起點,以它子樹里的點為終點」的路徑都會產生1的貢獻,即\(w_+=siz_i\)
然後遍歷當前區域,對於每種顏色\(i\),記\(w_i\)表示當前遍歷的重心的兒子的子樹裡,顏色\(i\)對\(w_i\)的貢獻為\(w_i\)(也就是說,\(w_i-w_i\)表示顏色\(i\)對「從重心出發的所有不經過當前遍歷的重心的兒子路徑的得分總和」的貢獻)
記\(x\)表示過重心的路徑對當前遍歷到的點的貢獻,初始值為\(\sigma (w_i-w_i)\)
如果當前點\(i\)的顏色不是在重心到它的路徑上第一次出現的,那麼\(x\)不變
如果當前點\(i\)的顏色是在重心到它的路徑上第一次出現的,\(c_i\)本來只對終點在大小為\(w_\)的區域中的路徑有貢獻,而現在對所有終點不和\(i\)在乙個重心的兒子的子樹裡的路徑都有貢獻
\(x+=-(w_-w_)+siz_-siz_\)
畫個圖說明一下:
if(max(nowmax,sumsiz-siz[u])一些感想
泡狐龍的bgm「妖艶なる舞 〜 タマミツネ」太好聽了
P2664 樹上遊戲
分析 點分治。首先關於答案的統計轉化成計算每個顏色的貢獻。1 計算從根出發的路徑的答案 如果某乙個顏色是從根到這個點的鏈上的第一次出現的,那麼這個顏色會對根產生siz x 個貢獻。根連向它子樹的任意乙個點的路徑都包含這個顏色 2 計算子樹內每個點過根的路徑答案 記錄乙個陣列sum i 表示從根出發包...
P2664 樹上遊戲
題面 作為一道經典的點分治題目,此題能很好的考察對點分治的運用。個人認為點分治的本質在於 對於樹上近乎n2 的路徑詢問,通過有效的 劃分,使之能在穩定的時間內通過儲存資訊 獲取資訊的經典方式來求 出答案。由此看出點分治的關鍵在於儲存資訊與獲取資訊的方式。點分治的模板套上之後我們只需要考慮的是子樹與子...
P2664 樹上遊戲 (點分治)
題目鏈結 題面 題解 點分治。考慮當前點分治子樹的根節點為p。那麼我們需要處理兩部分貢獻。所有節點對點p的貢獻 包括p節點自己 經過點p的路徑 x,y 對x點的貢獻。第一類貢獻 如果乙個節點 x 的顏色 color x 在它到根節點 p 的路徑上是第一次出現,那麼以 x 為根的子樹上的每個節點,都可...