• 动态虚树计数


    我们首先考虑没有操作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的方法好像很简单,在此不做赘述。

  • 相关阅读:
    POJ 2752 Seek the Name, Seek the Fame
    POJ 2406 Power Strings
    KMP 算法总结
    SGU 275 To xor or not to xor
    hihocoder 1196 高斯消元.二
    hihoCoder 1195 高斯消元.一
    UvaLive 5026 Building Roads
    HDU 2196 computer
    Notions of Flow Networks and Flows
    C/C++代码中的笔误
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/10355540.html
Copyright © 2020-2023  润新知