不那么套路的点分题。
首先根据题意容易得到一个(O(n^2))的做法。
显然我们对于一个解,它的最优答案是内部的色数。
一个解合法的条件是它的外部不包含这个解内部的颜色。
那么我们可以暴力模拟这个过程。强制钦定一种颜色被选择,然后把这种颜色包含的所有点都加入解中,重复此过程直到解合法。
遍历一个颜色的链并可以从为当前颜色的所有点跳父亲。
考虑点分。根据上面的思想,就像点分治处理跨过路径的询问一样,强制钦定一个解在深度在dfs点分树的过程中第一次到的位置被选择。
然后使用上面的bfs做法。
注意到对于每种颜色的一个节点x,我们可以跳父亲到它第一个被访问过的点,然后break掉。
这是因为它的父亲如果被访问过,则它的父亲也可以更新它接下来会更新的点(比较绕)
这样子就能在(O(n))的时间内算出强制包含重心的解了。
时间复杂度(O(nlog_2n))