1 条题解
-
0
自动搬运
来自洛谷,原作者为

周子衡
Shadow is the light!搬运于
2025-08-24 22:45:08,当前版本为作者最后更新于2023-01-17 15:20:34,作者可能在搬运后再次修改,您可在原文处查看最新版自动搬运只会搬运当前题目点赞数最高的题解,您可前往洛谷题解查看更多
以下是正文
退役!
我们先来猜测无解的条件。注意到在一组合法解中,对固定的某个社团,相邻的 个人中最多有 个来自该社团。因而每个社团的大小都不应该超过总人数的 ,反之无解。
下面我们来说明上面给出的就是有解的等价条件,并给出一种构造解的算法。
首先需要注意的是,如果每个社团大小都不超过 ,那么任意排列都是合法的。接下来我们将讨论至少有一个社团人数不小于 的情形。
考虑归纳构造。由于猜测的最佳比例是 ,考虑一次取 个人,对剩下的 个人构造一组解出来。我们不妨规定取出的 个人一定要是圆上连续的一段。注意到在存在一个社团大小为 的极端情况下,构造是非常固定的:

此时任意连续三个人中都有两个来自 大社团,一个不来自 大社团。故我们构造的时候作如下规定:
- 设当前 个人中人数最多的社团为 ,那么我们选取的 人中两人来自 ,一人不来自 。
(另外可以注意到,存在一个大社团人数达到 时,上面图片中的构造一定是正确的。这也是猜测可能成立的迹象之一。)
在继续往下推进之前,我们首先需要保证:剩下 个人中,不存在占比 的人有相同的社团。注意到由于 少了整整 个人,那么在剩下的人中 的占比必然不超过 ;而对于一个不同于 的社团 ,注意到原本 的人数不超过 ,故我们需要保证 恒成立,这需要
我们稍稍改进一下这个结果。注意到这实际上浪费了“一人不来自 “这里的操作空间,我们让这个人来自剩下的社团中人数最多的那个(记为 ),那么 的人数不超过 ,我们需要保证 ,这只需要 就够了。而对于 以外的任意社团 , 的人数显然不超过 ,我们需要保证 ,这同样只需要 即可。而即便不借助计算机,也很容易验证 时我们的猜想一定是正确的。故我们可以只在 的时候采用归纳的方法, 时直接暴力枚举即可。
(当然,如果只推出 ,也很容易在计算机的帮助下逐一验证 的情形,因而上面的推导不是必要的。)
下面我们将进入本文的重头戏:对取出的 个人,证明一定可以将他们插到剩下 个人的圆中的某个连续段,而不破坏排列的合法性。
注意到取出的三个人中有两个来自同一社团 。观察到
观察 1 如果剩下 人的排列中存在连续两个人来自 ,则可将 人合法地插到这两个 之间。
证明 如下图,把 人中不在 的那个人放在中间。注意到新出现的 可疑段 中,任何连续三个人中都有两个红色,那么如果同色必须同红色(否则两个红色的人又同在另一个社团里,这是非法的)。而显然没有三个连续的人都是红色的。(这里需要注意,由于原排列合法,因而两个 外侧的两个人都不可能在社团 。)
(这里 可疑段 指不能从原 人的排列合法而直接推出合法的连续 人,也就是至少包含 个新人的连续段。)

实际上,上面的证明中并没有用到 的任何性质。我们完全可以换成一个别的社团。换言之
观察 2 如果 人中有两个人同在某社团 ,而另外 人的排列中存在两个相邻的人都在社团 ,那么可以将 人合法地插进两个 中间。
如果上面的做法还找不到合法解怎么办呢?我们对 人之间的关系作一分类讨论。下面设 是 人中来自 的两人, 是剩下的一人。
情况 A: 都不与 有公共社团
由于 是原本人数最多的社团,那么 ,则剩下 人中还有一人 属于 。我们在圆上找到他,设原本在他身后的两个人依次是 ,在他身前的人是 。在他身后依次排列 。分析所有可疑段,跨过 的显然是合法的;由于 两侧的人都不在 中,则 一定合法;唯一需要担心的是 。但如果它不合法,说明三人在同一社团中,则 不在这个社团中(否则 就共同出现在两个社团中了);我们把三个人的顺序变成 即可。
情况 B: 中恰有一个人与 有公共社团
不妨设 共同在社团 中。此时 地位是对称的。我们把环上所有在 中至少一个的人涂成蓝色。(由于 同时在 中,环上不可能有人同时在 中。)如果存在相邻的两个人一蓝一白,不妨设蓝色的人在社团 中,仿照情况 A 的讨论知以下两种方案必有一种合法:

否则,环上的所有人颜色相同。而显见环上至少有一个蓝色,故环上全是蓝色。故环上一定是 间隔排列。下面的方案显然合法:

情况 C: 都与 有公共社团
与情况 B 非常类似。不妨设 参加社团 , 参加社团 , 参加社团 。同样把环上至少参加了 一个社团的人涂成蓝色,并分类讨论是否存在 蓝-白 段。这里的讨论交给读者自行完成。
综上,我们证明了结论的正确性,并给出了一种实际的构造方法。
关于实现细节
哭哭……
上面的东西如果朴素实现的话时间复杂度 / 常数可能无法通过。但我们其实可以完全不理会证明的细节!我们只需要每次按上面的证明选人,然后暴力枚举这 个人插在哪两个人之间以及他们的排列顺序如何;上面的证明保证了一定能找到解。
选人的时候如果用堆维护最大值的话会多一个 ,但其实完全可以不用:用一个桶存下当前所有社团大小就可以了。时间复杂度可以做到 (这里认为 )。可以通过此题。
- 1
信息
- ID
- 8383
- 时间
- 1000ms
- 内存
- 1024MiB
- 难度
- 7
- 标签
- 递交数
- 0
- 已通过
- 0
- 上传者