CF1515F Phoenix and Earthquake 题解

CF1515F

简单题。

先猜个结论,当且仅当 $\sum\limits_{i=1}^{n}a_i>(n-1)x$ 时无解,这是好想的。因为每次合并减少一个点,总点权减少 $x$。

它为什么是对的呢?考虑反证法。令 $u$ 为当前的点权最大的点。若不能合并,则有 $a_u<x-a_v$,则 $\sum a_i\le ca_u<c(x-a_v)$,其中 $c$ 为当前点的数量,将括号拆开后显然与和 $\ge (c-1)x$ 相矛盾。原命题得证。

那我们就可以每次选择点权最大的点随便与一条相连的边合并即可。这个可以使用并查集加启发式合并实现,查询全局 $\max$ 可以使用 set 或 线段树。这里的时间复杂度是 $\mathcal{O}(m\log m+n\log n)$,因为这里的启发式合并是用在边集上的。

这样实现起来有点麻烦,考虑能不能简化,即对任意一棵生成树有一个普适的做法。

可以先在叶子节点向上贪心,即 dfs 后的 $v$ 的权值若 $\ge 0$,则与 $u$ 合并。然后再从根向叶子的贪心一遍,从上到下的合并所有未被选择的树边。

贪心的正确性是显然的,在第一次 dfs 时将每个节点的 $a$ 值会变为不能再增加,然后又因为最后一定有解,所以这时再让它不断减少也不会出现负数。想到这个贪心也是容易的,因为最后的总值是非负的,又不能再计算过程中出现负数,肯定就是考虑把能加的先加上,最后统一执行减法操作,这样就一定能保证非负。

实现上,如果第一次 dfs 时不选这条边,是可以直接求出答案的位置的。于是就只需要一次 dfs 了。注意 $a$ 数组合并后有可能会爆 int。

评测记录

posted @ 2023-10-12 22:04  Pengzt  阅读(3)  评论(0编辑  收藏  举报  来源