定义 $s(i,j)$ 为 $i$ 到 $j$ 的颜色数量。
考虑点分治
- 考虑$p\rightarrow x$
如果在$dfs$往下搜一颗子树的时候在某节点$u$发现某个颜色第一次出现,那么这个颜色随后共享的就是$size[u]$。
最后$\sum$即=$ans[p]$
- 考虑$x\rightarrow p\rightarrow y$
假设搜到某个结点$x$,$p\rightarrow x$有$k$种颜色($c[p]$不算,其他子树出现的颜色也不算)。那么$ans[x]+=k\times (size[p]-size[x所在子树])$,然后接下来就是加上$p\rightarrow y$的各种值,即就是上题少遍历$x$所在子树所形成的答案。
- 为了方便处理,每次对一颗子树进行处理的时候,$dfs$先去除影响。
- 最后$dfs$勿忘清空
代码
1 |
|