首都城市

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

posted @ 2020-10-17 15:49  celerity1  阅读(60)  评论(0编辑  收藏  举报