SS241126C. 樹(tree)
題意
給你一個以 \(1\) 為根的樹,每個點有點權 \(v_i\)。設這棵樹的點集為 \(V\),一個合法的子集 \(V' \subseteq V\),滿足存在 \(p \in V'\),使得 \(V'\) 中任意兩點的 LCA 都是 \(p\)。
把 \(V\) 分成若干個 \(V'\) 稱為一種劃分方案,一種劃分方案 \(\{ V' \}\) 的價值為 \(\prod_{\{V'\}} (\sum_{i \in V'} v_i)\)。求所有合法發劃分方案的價值和。答案對輸入的 \(mod\) 取模。
\(n \le 100\)。
思路
黃隊講得非常仔細,可惜我太菜了。
不保證過程正確,如有誤歡迎指出/bx
考慮刻畫合法 \(V'\)。發現其形如有一個點 \(p\) 是 \(V'\) 中深度最淺的點,我們把它叫做集合的頭,然後 \(p\) 的每棵子樹裡,可以選擇至多 \(1\) 個點加入集合。
考慮先解決一個簡單的問題,計算合法劃分方案數。
考慮樹形 DP,從下往上轉移。要計算加入點 \(u\) 的貢獻,分 \(u\) 是一個集合的頭,或者是集合的一般結點來討論。如果 \(u\) 是一個集合的頭,那麼 \(u\) 的每棵子樹都可以選擇一個或者不選點加入 \(u\) 的集合;如果 \(u\) 是一般結點,那麼我們先不算貢獻,把它的貢獻留到處理頭結點時去計算。
設 \(f_{u,s,0/1}\) 表示處理到點 \(u\),點 \(u\) 的子樹裡一共有多少個一般結點未被使用,點 \(u\) 是/不是頭結點,的劃分方案數。答案是 \(f_{1,0,1}\)。
對於 \(u\) 是頭結點的情況。列舉 \(u\) 的兒子 \(v\),列舉 \(v\) 的子樹有多少個未被使用的一般結點,列舉在 \(v\) 的子樹中選擇一個一般結點加入 \(u\) 的集合還是不選。
轉移複雜度是 \(siz_u\)。注意列舉每個 \(v\) 要把上一個 \(v\) 時計算的 \(f_u\) 覆蓋掉,注意轉移順序應該是 \(j\) 從大往小列舉。初始 \(f_{u,0,1}=1\)。
對於 \(u\) 是一般結點的情況,仍然列舉 \(u\) 的兒子 \(v\),列舉 \(v\) 的子樹有多少個沒有被使用的一般結點。初始 \(f_{u,1,0}=1\)。
應該是這樣的吧。時間是 \(O(n^2)\)。
求原問題。
考慮展開那一坨連乘,相當於在每個集合裡選擇一個點塗黑,然後貢獻是黑點點權的乘積,對每種塗色方案的貢獻求和。即
仍然考慮從下往上樹形 DP。考慮加入點 \(u\) 帶來的影響。
設 \(f_{u,s_0,s_1,0/1}\) 表示子樹 \(u\) 有 \(s_0\) 個未被使用的白點,有 \(s_1\) 個未被使用的黑點,點 \(u\) 是頭結點,集合裡有沒有黑點,的方案的價值之和。\(g_{u,s_0,s_1}\) 表示 \(u\) 是一般結點的答案。
初值 \(f_{u,0,0,0}=1,f_{u,0,0,1}=v_u,g_{u,1,0}=1,g_{u,0,1}=v_u\)。
應該就是這些了吧。
答案就是 \(f_{1,0,0,1}\)。
code
應該不會太難寫。