1. 程式人生 > 其它 >21.3.13 t3

21.3.13 t3

tag:組合計數,點分治,容斥

題意

給一棵樹,對每個點分配一個權值(可以為 \(0\)),所有點權值和為 \(m\)。求所有分配方案的帶權重心標號和(多個重心取標號最小的一個)。

\(n\leq2\cdot10^5,\ m\leq5\cdot10^6\)


\(m\) 為奇數時,對於一條邊來說,重心在哪一端是確定的,因為兩邊的權值和不可能相同。所以先考慮 \(m\) 為奇數的情況。考慮求出重心在 \(x\) 子樹內的方案數,然後容斥一下可以求出重心剛好在 \(x\) 的方案數。

考慮列舉分配給子樹的權值和,然後兩邊都變成了一個,球相同,盒子不同可以為空的放球問題。(設 \(p=\frac m2+1\)

\[f(x)=\sum_{i=p}^m\binom {i+sz-1}{sz-1}\binom{(m-i)+(n-sz)-1}{(n-sz)-1} \]

暴力計算顯然不行,考慮它的實際意義:左邊有 \(sz\) 個盒子,右邊有 \(n-sz\) 個盒子,放 \(m\) 個相同的球,且左邊不能放超過 \(\frac m2\) 個球。好像可做了一點,考慮從 \(sz\) 推到 \(sz+1\),發現多出來的情況即為第 \(\frac m2\) 個球剛好放在第 \(sz+1\) 個盒子裡的方案。那麼 \([1,\frac m2-1]\) 這些球往 \(sz+1\) 個盒子裡隨便放,然後 \([\frac m2+1,m]\)

這些球往 \(n-sz\) 個盒子裡隨便放,是兩個組合數相乘。所以預處理複雜度變為 \(O(n+m)\)


考慮 \(n\) 為偶數會有什麼問題。對於這種情況:一條 \(s\)\(t\) 的鏈,鏈的兩端子樹和分別為 \(\frac m2\),其餘點全部為 \(0\)。那麼此時這一條鏈上的點都可以為重心,所以貢獻為 \(min\)。但我們在假定 \(m\) 為奇數時,把這條鏈的貢獻算成了 方案數\(\cdot \sum val\),所以對於每條路徑,要減去 方案數\(\cdot \sum val\),再加上 方案數\(\cdot\ min\)。這很顯然是一個點分治解決。在處理 \(min\)

的時候,可以使用桶排,每次分治的時候把值域用一個vector傳進去,減少了一個快排的 \(log\)