zoukankan      html  css  js  c++  java
  • 动态虚树计数

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

  • 相关阅读:
    函数二
    python控制台输出带颜色的文字方法
    is 和 == 的区别
    基本数据类型(dict)
    基本数据类型(list,tuple)
    基本数据类型(int,bool,str)
    Python运算符与编码
    Java并发编程:synchronized
    泛型中? super T和? extends T的区别
    java中的匿名内部类总结
  • 原文地址:https://www.cnblogs.com/Creed-qwq/p/10355540.html
Copyright © 2011-2022 走看看