1 条题解
-
0
这是官方题解的 AI 翻译,使用了 GPT-5.5 Thinking 模型。
子任务 1:
先注意一个很基础的性质:每过一秒,每只羊所在位置的奇偶性都会翻转。
因此:
-
如果一开始存在两只羊,位置奇偶性不同,那么答案显然是
No。
因为无论过多久,场上始终都会同时存在站在奇数列和偶数列的羊。 -
否则,可以证明答案总是存在。
一个简单可行的构造是:
如果当前最右一列的列号奇偶性,与所有羊所在列的奇偶性不同,那么这一列一定没有羊(这正是奇偶性带来的结论),于是我们总能把右端切掉一个长度为 的区间。
不断这么做,就能把总列数缩到 。而当宽度变成 时,所有羊的运动方式显然就完全相同了。
子任务 2:
如果连 的情况都能做,那么剩下的状态数已经很少了,直接手推或者暴力都可以。
可以把状态设成:
- 每只羊当前的位置;
- 当前线段的长度。
转移只有两种:
- 模拟经过一秒;
- 把线段长度减小。
于是整个问题就是一个图上的可达性问题,用任意图算法都能做。
当然,也可以写更直接的暴力搜索。子任务 3:
先看最典型的情况:。
把图画出来就会发现,答案是 ,
而且只要在经过同样多的时间后,把线段缩到这个长度即可。
:::align{center}
:::接下来考虑图中标成蓝色和红色的两段“距离”。
它们分别表示:- 第一只羊沿着运动轨迹到第二只羊的距离;
- 第二只羊沿着运动轨迹到第一只羊的距离。
这里有两个关键结论。
-
两只羊运动方式完全相同,当且仅当其中一个方向上的距离恰好为 。
-
当我们把场地长度减少 时,这两个距离中恰好有一个会减少 。
于是,立刻可以得到一个 做法:
直接模拟两只羊的运动。如果当前裁剪会让那条较短的距离变小,那么就把线段长度减 。
这样最多经过 次操作,过程一定会结束。如何做到
再进一步想一想:
如果我们保留的是两段距离里较大的那个,设它的长度为 ,那么答案就是 。
原因是:如果最终保留的线段长度为 ,那么一只羊到另一只羊的那段对应距离会是 。
至于如何具体恢复操作序列,原文把它放到了完整解法部分统一讨论。
子任务 4:
在 的基础上,可以把模型再抽象一步。
注意,原线段其实可以看成一个长度为 的环。
而把线段长度减少 ,就等价于让这个环的长度减少 。
:::align{center}
:::原文图中举了一个例子:三只羊的位置分别是 ,方向分别是
RLL。为了方便说明,图里把位置改成了从 开始编号。图上红色的点表示:当我们把线段缩短时,这些点会从环上被删掉。接着,把“相邻两只羊之间的距离”定义成:沿着这个环,从一只羊走到下一只羊所经过的弧长。
这样一来,这个模型和 时其实并没有本质区别。
我们仍然只关心一件事:相邻两只羊之间的最大距离。
于是和 时一样,有两种思路:
- 直接模拟羊的运动,并在合适的时候裁剪,复杂度是 ;
- 或者直接得出结论:答案为 ,
其中 是环上相邻两只羊之间的最大距离。
完整解法:如何恢复方案
当 时,我们已经可以暴力求解,所以剩下的问题只有一个:在满分范围内如何构造具体方案。
先把所有羊按它们在环上的位置排序。
设存在某只羊 ,使得从羊 到环上下一只羊的那段弧最长。那么恢复方案可以这样做:
- 重新编号,让羊 变成最后一只羊。
- 先等待,直到最后一只羊在环上的位置变成 (这里按 开始编号)。
这等价于说:让它站到最后一列。 - 设从羊 到羊 的那段弧长为 。
为了删掉这段弧,只需要继续“转动”这个环,使得这只羊来到位置 。然后把线段长度减少 ,这样一来,第 只羊就会重新站在位置 。 - 接下来就可以忽略第 只羊,继续处理第 只羊,以此类推。
不难发现,这个过程最终会删掉除了最长那段弧以外的所有弧,因此方案构造就是正确的。
-
- 1
信息
- ID
- 12579
- 时间
- 1000ms
- 内存
- 700MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者