\(\texttt{link}\)。
感覺是道好題,我們先稍微理一下思路。
首先,我們定義在初始狀態下,根節點的權值為 \(W\)。
先考慮一個差分的技巧,即我們對於每個 \(k\),求出 \(w(S) \le k\),\(S\) 的個數,然後 \(k\) 的答案就是用 \(\le k\) 的個數減去 \(\le k-1\) 的個數。
我們先假設我們此時透過列舉知道了 \(w(S)\le k\) 所對應的 \(k\),考慮怎麼去算 \(S\) 的個數。
我們發現一個比較 \(\texttt{naive}\) 的 DP,(為什麼我感覺一點也不 \(\texttt{naive}\),根本就沒想到),即定義 \(dp_{x,0/1/2}\) 分別表示透過操作 \(x\) 子樹內的葉子節點,有多少種 \(S\) 可以分別滿足 \(x\) 的當前權值 \(<W,=W,>W\)。
初始值就是葉子節點 \(x\),\(x+k,x-k\) 與 \(W\) 的關係,這裡就不細說了。
轉移應該比較簡單,分討一下當前節點的奇數和偶數深度即可。答案就是 \(dp_{1,0}+dp_{1,2}\)。
但是你會發現這樣會算重,就是說有的 \(S\) 它不僅可以做到 \(<W\),也可以做到 \(>W\),而它會被計算兩次。所以這樣做是不行的。
考慮有沒有什麼辦法能夠做到只考慮 \(>W,<W\) 中的一個便可以得到答案。
我們思考一下根節點這個 \(W\) 的值是怎麼來的,顯然是透過從 \(W\to 1\) 這條鏈上一步一步過來的,並且顯然這條鏈是對根節點的修改起決定性因素的,故我們考慮去重點觀察一下這條鏈。
我們發現這條鏈上只要有一個點的權值發生了變動那麼根節點的權值就會發生改變。
更具體的,如果我們將這條鏈上的邊拆開,這樣這棵樹就會變成若干個連通塊,每個連通塊的根節點就是這條鏈上的節點。我們只需要求出每個連通塊根節點改變的機率即可。(其實也就是方案)
考慮一個事情,對於連通塊一個點 \(x\),若其深度為奇數,那麼顯然我們將其改為 \(>W\) 那麼根節點的權值就會發生改變,若為偶數,就改為 \(<W\)。並且顯然你符合這樣改的方案數一定是合法的全部方案數。
故我們定義 \(dp_x\) 表示將 \(x\) 的權值變為 \(>W\)(如果 \(x\) 所在連通塊的根節點的深度是奇數就是 \(>W\),否則就是 \(<W\))有多少種方案。雖然 \(<W,>W\) 的定義不同,但是轉移其實是是差不多的:
-
\(x\) 的深度為奇數,小小的容斥轉移,\(dp_x=2^{siz_x}-\prod_{j\in son_x}(2^{siz_j}-dp_j)\)
-
\(x\) 的深度為偶數,\(dp_x=\prod_{j\in son_x}dp_j\)
最終答案就是對於每個連通塊的根節點 \(x\),有 \(2^n-\prod dp_x\)
對於 \(dp_x\) 的初始值,就是對於每個葉子,是否滿足 \(x-k<W\) 或者 \(x-k>W\) (這個是其所在聯通塊的根節點深度的奇偶性所決定的符號)滿足就是 \(1\) 否則就是 \(0\)。
此時對於每一個 \(k\) 我們就得到了求解的方式。發現對於 \(k\) 從 \(1\to n\),每個葉子節點的 \(dp_x\) 只會從 \(0\to 1,1\to 0\) 最多改變一次,此時直接透過動態 DP 暴力修改葉子節點然後求解即可。
採用最普通的樹剖求解複雜度為 \(\mathcal{O}(n\log ^2n)\)。
程式碼好難寫,先咕咕咕了。