CF1305G Kuroni and Antihype

题意:有一张图,有 个点,点有点权

之间存在无向边当且仅当

接下来不断执行如下两个操作之一 :

  • 将一个没有染色的点 染色。

  • 若一个未染色点 和某个染色点 直接相连,将 染色,并获得 元。

当所有点都被染色,操作停止。问能获得的钱数最大值。

,时限


在操作二中让 连边,即得到一棵生成森林。

为了避免讨论,新建一个点 ,且初始时就被染色。这样就只用考虑操作二,且产生的是一整棵生成树。

但是,操作的收益和点权有关,不能直接转化成最小生成树。

边权写成 ,不难发现最后每个 都被多算了恰好一次,减去即可。

由于连边条件, 边权是两个不交集合的并。

枚举边权 ,再枚举子集 ,在 之间连边。这样一共会产生 条边。

(注意,点权相同的点要批量处理)

从小到大枚举边权跑 ,在边多点少时并查集的复杂度是线性的,所以复杂度为 ,已经可以通过。

当然还有更好的做法,考虑 算法,每一轮,我们要对每个连通块找到最小出边(到达其他连通块)。

按照套路,每一轮都做一个子集和 (FMT),求出每个集合内连通块编号互异的点权最大值和次大值。

然后,对于某个点 ,查看集合 中的最大值,若和自己同一个连通块,则选择次大值。

每一轮的复杂度是 的,共 轮,总复杂度即为