动态虚树计数

我们首先考虑没有操作1和操作2怎么做

分析一下lca(x,y)!=root这个条件。
也就是说,每一组中的任意两个点,都需要属于根节点的两个不同儿子的子树。
我们不妨求出根节点的每一个儿子中有多少个给出的点,这个直接用树状数组就能求出来。
这样就得到了一个序列a1,a2...acnt。
这里注意:这个地方cnt的大小是和根节点的度数无关的,cnt不会大于询问中的k,因此不会被菊花图卡。

得到这个序列后,转化为这样一个问题。
n种颜色,每种颜色有ai个,划分为最多m组的方案数,每一组颜色不同。

首先枚举一下组数o。
我们不妨考虑一波容斥,枚举至少有几组爆零了。
然后只需要对每一种颜色做一个组合数分配即可。
也就是∑k (-1)^k πi C(o-k,ai)。
这样就可以m^2n的复杂度回答一组询问,显然还不够优秀。

我们大力拆一波式子,把组合数拆为阶乘的形式。
这样我们对于那个内层的循环,就只需要维护三部分
第一部分:(o-k)!,连乘后就是个幂的形式。
第二部分:inv(ai!),连乘后是一个与k无关的变量,可以提前预处理。
第三部分:inv((o-k-ai)!) 连乘后是一个与o-k有关的变量。
由于o-k的取值只有m种,不妨提前预处理一发,对于每一个o-k处理出(o-k-ai)!的连乘。
然后就可以m^2回答一组询问啦!

看起来m^2n是过不去的,但实际上,由于存在一个不等式,∑ m<=100000
(100000/m)∑m^2=100000*m。这样复杂度就是对的啦!

然而,容斥的做法好像是很sb的,dp的方法好像很简单,在此不做赘述。

猜你喜欢

转载自www.cnblogs.com/Creed-qwq/p/10355540.html