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

上一篇:腾讯T3亲自教你!作为一名Android面试者你应该知道的,看这一篇就够了!


下一篇:腾讯T3大佬亲自讲解!JVM虚拟机原理深入解析,赶紧收藏!