、

P10846 [EGOI 2024] Team Coding

题意

一棵以 \(1\) 为根的树,每个点有颜色。同一层的两个点颜色可以互换。以任意一个点的颜色它的子树经过任意交换的最多跟这个点相同的颜色个数和最小交换次数。

\(n,|C|\le 10^5\)。

思路

发现第二问是逗你玩的,对于 \(u\) 和它的最大答案 \(A\),第二问答案就是 \(A\) 减去 \(u\) 原本和 \(u\) 颜色相同的个数,这个启发式合并一下就搞完了。

观察部分分发现有颜色数很多和颜色数很少的两种情况,这提醒我们思考根号分治。

对于一个颜色数,如果它有不超过 \(B\) 个节点。我们可以考虑枚举每一个节点作为负责人,那么我们维护每一层的对应颜色数 \(c_d\)。那么我们只需要求出负责人在 \(d\) 层的后代个数 \(N_d\)。那么对第一问答案的贡献就是 \(\min(c_d,N_d)\)。后代个数可以通过 dfn 序每一层排序一下二分得到,复杂度 \(O(nB\log n)\)。

对于超过 \(B\) 个节点的,那么这样的颜色数不超过 \(\frac{n}{B}\) 个。我们考虑去启发式合并一下整棵树全部优先向当前颜色上靠的最大值,那么复杂度就是 \(O(\frac{n^2\log n}{B})\)。

我们取 \(B=\sqrt n\) 平衡复杂度到 \(O(n\sqrt n\log n)\),但实测跑的飞快。

posted @ 2026-09-24 14:44  tanghg  阅读(5)  评论(0)    收藏  举报