题解:
首先扯一些并没有用的
如果问题是在序列上的怎么做
跟bzoj那道超级钢琴的加强版要求数字不同那个原理一样
主席树扫描过去 找到同一种颜色的前驱 这一段+1就可以了
扩展到树上
如果求链上的颜色个数,套上树剖和序列就一样了
另外找前驱在树上是不能用一个数组记录的
所以也得用主席树实现(维护每个颜色上一次出现的位置)
另外如果是查询子树颜色个数在线
我们可以用dfs序把树变序列
然后跟上面一样
如果离线
直接线段树启发式合并
然后回到这道题。。
上面的方法应该一个都不行(至少我不会)
不过正解也是很简单的
既然考虑每个点的子树不可行
我们可以考虑每个点对哪些点的子树有贡献
于是算法就出来了我们可以对每个点分开做
然后树链求并(我好像只会用虚树来求)
现在这题加了一个限制
线段树修改改成主席树就好了