SS241126C. 樹(tree)

liyixin發表於2024-11-26

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\)

\[(v \in son_u) \\ \begin{aligned} f_{u,s+j,1} & \gets f_{u,s,1} \times f_{v,j}\\ f_{u,s+j-1,1} & \gets f_{u,s,1} \times j \times f_{v,j} \end{aligned} \]

對於 \(u\) 是一般結點的情況,仍然列舉 \(u\) 的兒子 \(v\),列舉 \(v\) 的子樹有多少個沒有被使用的一般結點。初始 \(f_{u,1,0}=1\)

\[(v \in son_u)\\ f_{u,s+j+1,0} \gets f_{u,s,0} \times f_{v,j} \]

應該是這樣的吧。時間是 \(O(n^2)\)


求原問題。

考慮展開那一坨連乘,相當於在每個集合裡選擇一個點塗黑,然後貢獻是黑點點權的乘積,對每種塗色方案的貢獻求和。即

\[\sum_{\{ V' \} } \sum_{\{col\}} \prod_{col_u = 1} v_u \]

仍然考慮從下往上樹形 DP。考慮加入點 \(u\) 帶來的影響。

\[\begin{cases} u 是頭結點 \begin{cases} col_u = 1 \Rightarrow [v 子樹不選點/選一個白點]\\ col_u = 0 \Rightarrow [v 子樹不選點/選一個點]\cup [至少一個 v 子樹選擇了黑點] \end{cases}\\ u 是一般結點 \begin{cases} \begin{rcases} col_u = 1 \\ col_u = 0 \end{rcases} 留到頭結點再處理 \end{cases} \end{cases} \]

\(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\)

\[\begin{aligned} f_{u,s_0+x,s_1+y,1} & \gets f_{u,s_0,s_1,1} \times (f_{v,x,y}+g_{v,x,y})\\ f_{u,s_0+x-1,s_1+y,1} & \gets f_{u,s_0,s_1,1} \times (f_{v,x,y}+g_{v,x,y}) \times x\\ f_{u,s_0+x,s_1+y,0} & \gets f_{u,s_0,s_1,0} \times (f_{v,x,y}+g_{v,x,y})\\ f_{u,s_0+x-1,s_1+y,0} & \gets f_{u,s_0,s_1,0} \times (f_{v,x,y}+g_{v,x,y}) \times x\\ f_{u,s_0+x,s_1+y-1,1} & \gets f_{u,s_0,s_1,0} \times (f_{v,x,y}+g_{v,x,y}) \times y\\ g_{u,s_0+x,s_1+y} & \gets g_{u,s_0,s_1} \times (f_{v,x,y}+g_{v,x,y}) \end{aligned} \]

應該就是這些了吧。

答案就是 \(f_{1,0,0,1}\)

code

應該不會太難寫。

相關文章