P2664 树上游戏
对于树上n个点,每个点有不同颜色,求解每个点到其他点的路径上不同颜色个数之和。
首先看到这种树上点对问题,我们可以想到点分治,然后考虑每次分治如何求解答案,本质上就是一个数颜色的问题,然后我们采用类似的思路,考虑每个颜色第一次出现时的贡献,但是现在的问题就在于一条链是没有前后的,所以我们可能需要一些计算。
首先对于分治中心的贡献计算,我们可以从中心开始dfs,在每个颜色第一次出现的地方有size的贡献。
然后考虑每个子树内部的点,对于在从当前点到分治中心的链上出现过的颜色,我们直接将其统计为 c n t ( s i z r t − s i z x ) cnt(siz_{rt}-siz_{x}) cnt(sizrt−sizx)然后考虑没有在这一段出现的颜色,那就是之前一开始在其他子树内部出现的贡献,但是要减去在当前这条链上已经出现的颜色贡献和当前所在子树内部的颜色贡