http://acm.hdu.edu.cn/showproblem.php?pid=6035
题意:有n(2e5)个结点的一棵树,每一个结点上都有一个颜色c[i],设一条路径的value为这天路径上点的颜色
的种类数,求树上所有路径的value和。
分析:树上所有路径,那显而易见是要算贡献的,那怎么算每个颜色/每个点对ans的贡献呢?首先看,要算每个点
对ans的贡献和很难算的,因为路径上还可以有同颜色的别的点呀,并且同颜色的点的个数还是不确定的,你想先算起来
再除也没有办法。于是可以算每个颜色对ans的贡献,因为不知道不包含某个颜色的路径有多少条,但是->->->
你是可以算出每个颜色对ans缺少多少贡献的,每个颜色对ans最多有C(n,2)点贡献,对于没有贡献的路径,就是不含有
任何一个颜色为c的点,这样是不是好求些了?是的。怎么求有多少个无效路径,可以把所有颜色为c的点扣掉,剩下就是很多
个连通块,对每一个连通块,设大小为sz,那么它可以产生颜色c对ans无贡献的路径的条数就为C(sz,2)
最后理论最多ans为 n*C(n,2),减去每个颜色对ans缺少的贡献,就算出ans了
技巧:这里用到了一个“奇技淫巧”: