P10786 百万富翁题解

还是比较有意思的题目。

有一个十分简单的做法,就是考虑直接比较相邻两个数( 比较, 比较,以此类推)。此时单次需要 次操作,一共需要 次即可确定最大的元素。

这样的总次数是 次,需要询问 轮。我们似乎并不满意。

我们发现,题目限制给了更多的询问次数( 次),但我们只用掉了其中的 次,浪费了很多次数。

我们可以考虑扩展一下我们的策略。我们考虑不两个两个的比,而是 个的比。具体的,假设当前剩下来 个元素,我们将 个元素分成若干个大小为 的组,每个组内部两个元素都比较一遍得到最大值,如果剩下一些元素就单独成一组。

不难发现,我们如果需要区分出来 个元素的最大值,我们需要每两个元素比较一次。相当于是给定一张图,交互库可以给边定向,表示两个点的大小关系,然后你要找到图中最大的那个。

如果你不两两连边,交互库只需要找到不连边的两个点,让所有点都指向这两个点即可。这样我们就不能区分这两个点的大小关系。

但是,我们有很多种分组方式,应该如何选择最优的方法?

我们可以考虑 dp。我们发现只有轮数比较小,因此我们固定轮数最小化询问次数。

表示剩下 个元素的大小关系没有区分,剩下 轮需要花多少次询问区分出这些元素。

转移是枚举一个 ,表示将 个元素分成 个元素一组,组内两两比较得到最大值,然后求出来剩下的元素个数以及代价进行转移。

由于很多情况下组数是一样的,因此我们可以考虑整除分块优化一下,只选择个数最少和最多的进行转移,对于剩下组数相同的情况取最小值即可。

但是我们发现这个只能得到 分。

我们重新审视一下这个 DP。假设剩下的组数是 ,那么转移就是 ,其中 是两两比较的代价。而两两比较的代价是 。因此,我们的问题实际上是,对于分成 组的情况,最小化

由于一组的代价关于组数是一个二次函数且二次相系数为正,因此这个是一个下凸函数,增长的会越来越快。因此我们最优的方法就是将元素均匀分配到每一组里,如果有分不完的就在一些组里多加一个。

证明可以考虑把权值拆到元素上面。给大小为 的组 增加一个元素的代价是 。因此,给一个组增加元素的代价是越来越大的。

假设当前大小最小的组大小是 ,则此时选择将元素加入 一定不劣。原因是此时加入 更有“决策包容性”。即,加入 后能到达的状态,加入 后也能到达,并且代价还更优秀。

考虑一个此时加入 的解 ,对于每一个解 ,我们都可以构造出一组更加优秀的解 。考察 中的每个操作。

  • 此时将元素加入其它的组:那 也加入相同的组。代价差不变。
  • 此时将元素加入 组,那么我们此时也将元素加入 组,但是请注意,此时 中的 中少一个元素,因此此时解 的代价会比 更小。
  • 此时将元素加入 组。还记得 少一个元素吗?此时我们将这个元素补回来。此时两个解选择的元素集合一定是相同的,因此权值相同,后续的操作直接照搬即可。

我们可以简单延拓一下,这个解法对于下面这个问题也是成立的。

INFO
给定一颗 个节点的有根,你需要在树上选择出 个节点,满足如果选择了 ,那么 的父亲节点也必须选择。这棵树满足儿子节点的权值比父亲节点的权值更大,最小化选择节点的权值和。

证明方法是类似的,只需要将 改成子树即可。

另一个证明方法是交换论证,大致思路是假设最后的解不包含 ,那么从别的地方减掉一些元素下来拼接到 上会更优。

由此可以发现,我们都 个元素一组,剩下的元素自成一组其实并不是最优的。

我们采用新策略进行 DP。每次枚举组数 ,每组元素 个,剩下来 个元素,就给其中 组增加一个元素。

注意到 只有 个不同取值。不妨猜测在元素个数相同的时候代价是关于组数单峰的,最小值只出现在最小组数和最大组数,这样我们就可以整除分块了。

严格证明我不会(不要一头扎进证明里)。但可以感性理解。

感觉上固定轮数 则区分 个元素的代价 应该整体上大致是下凸的,因为看上去区分元素的代价是越来越贵的(这个我不会证,我也不知道对不对)。不过无论如何,这个肯定是单调递增的。

而增加组数的代价造成的代价减少是越来越小的(哎这个我会证)。

考虑从最大的元素头顶取元素组成新的一组。首先取出的元素个数越来越少,其次取出元素的代价越来越小。

不妨考虑第 次取出和第 次取出。首先第 次取出的元素肯定比 次更小。

首先我们将第 次取出的第 个元素的代价分成两部分, 是因为加入到一个新的组中需要 的代价。 表示这个元素在原来组中的贡献,因为是取出所以是负的。

假设 次取出来了 个元素,那么对于 次取出里,肯定有 。这是因为你的最大值会变得越来越小。因此 部分是 次操作减少的更多,而 的部分代价是一样的。而对于 次操作多取出来的一些元素,这些元素显然也会带来负的贡献。 因此 次操作带来的减少是比 次操作带来的减少是更多的。

以上。如果 下凸,那么两个函数加起来应该也是下凸的,最低点可以二分求出来。

如果不下凸,那么可以四边形不等式。

反正整除分块能过。


P10786 百万富翁题解
https://blogs.sving1024.top/posts/48882/
发布于
2026年7月24日
许可协议