21.3.13 t3
tag:組合計數,點分治,容斥
題意
給一棵樹,對每個點分配一個權值(可以為 \(0\)),所有點權值和為 \(m\)。求所有分配方案的帶權重心標號和(多個重心取標號最小的一個)。
\(n\leq2\cdot10^5,\ m\leq5\cdot10^6\)
當 \(m\) 為奇數時,對於一條邊來說,重心在哪一端是確定的,因為兩邊的權值和不可能相同。所以先考慮 \(m\) 為奇數的情況。考慮求出重心在 \(x\) 子樹內的方案數,然後容斥一下可以求出重心剛好在 \(x\) 的方案數。
考慮列舉分配給子樹的權值和,然後兩邊都變成了一個,球相同,盒子不同可以為空的放球問題。(設 \(p=\frac m2+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\) 為偶數會有什麼問題。對於這種情況:一條 \(s\) 到 \(t\) 的鏈,鏈的兩端子樹和分別為 \(\frac m2\),其餘點全部為 \(0\)。那麼此時這一條鏈上的點都可以為重心,所以貢獻為 \(min\)。但我們在假定 \(m\) 為奇數時,把這條鏈的貢獻算成了 方案數\(\cdot \sum val\),所以對於每條路徑,要減去 方案數\(\cdot \sum val\),再加上 方案數\(\cdot\ min\)。這很顯然是一個點分治解決。在處理 \(min\)
vector
傳進去,減少了一個快排的 \(log\)。