1 条题解

  • 0
    @ 2026-8-6 23:46:34

    这是官方题解的 AI 翻译,使用了 GPT-5.5 Thinking 模型。

    子任务 1:T=2 T=2

    先注意一个很基础的性质:每过一秒,每只羊所在位置的奇偶性都会翻转。

    因此:

    • 如果一开始存在两只羊,位置奇偶性不同,那么答案显然是 No
      因为无论过多久,场上始终都会同时存在站在奇数列和偶数列的羊。

    • 否则,可以证明答案总是存在。

    一个简单可行的构造是:

    如果当前最右一列的列号奇偶性,与所有羊所在列的奇偶性不同,那么这一列一定没有羊(这正是奇偶性带来的结论),于是我们总能把右端切掉一个长度为 1 1 的区间。

    不断这么做,就能把总列数缩到 1 1 。而当宽度变成 1 1 时,所有羊的运动方式显然就完全相同了。

    子任务 2:n3, m4 n\le 3,\ m\le 4

    如果连 T=1 T=1 的情况都能做,那么剩下的状态数已经很少了,直接手推或者暴力都可以。

    可以把状态设成:

    • 每只羊当前的位置;
    • 当前线段的长度。

    转移只有两种:

    1. 模拟经过一秒;
    2. 把线段长度减小。

    于是整个问题就是一个图上的可达性问题,用任意图算法都能做。
    当然,也可以写更直接的暴力搜索。

    子任务 3:n=2 n=2

    先看最典型的情况:a1=1, a2=m a_1=1,\ a_2=m

    把图画出来就会发现,答案是 m+12 \dfrac{m+1}{2}

    而且只要在经过同样多的时间后,把线段缩到这个长度即可。

    :::align{center} :::

    接下来考虑图中标成蓝色和红色的两段“距离”。
    它们分别表示:

    • 第一只羊沿着运动轨迹到第二只羊的距离;
    • 第二只羊沿着运动轨迹到第一只羊的距离。

    这里有两个关键结论。

    1. 两只羊运动方式完全相同,当且仅当其中一个方向上的距离恰好为 0 0

    2. 当我们把场地长度减少 1 1 时,这两个距离中恰好有一个会减少 2 2

    于是,立刻可以得到一个 O(m) O(m) 做法:

    直接模拟两只羊的运动。如果当前裁剪会让那条较短的距离变小,那么就把线段长度减 1 1
    这样最多经过 4m 4m 次操作,过程一定会结束。

    如何做到 O(1) O(1)

    再进一步想一想:

    如果我们保留的是两段距离里较大的那个,设它的长度为 x x ,那么答案就是 x2+1 \dfrac{x}{2}+1

    原因是:如果最终保留的线段长度为 x x ,那么一只羊到另一只羊的那段对应距离会是 2x2 2x-2

    至于如何具体恢复操作序列,原文把它放到了完整解法部分统一讨论。

    子任务 4:T=2 T=2

    n=2 n=2 的基础上,可以把模型再抽象一步。

    注意,原线段其实可以看成一个长度为 2m2 2m-2 的环。

    而把线段长度减少 1 1 ,就等价于让这个环的长度减少 2 2

    :::align{center} :::

    原文图中举了一个例子:三只羊的位置分别是 (2,4,2) (2,4,2) ,方向分别是 RLL。为了方便说明,图里把位置改成了从 0 0 开始编号。图上红色的点表示:当我们把线段缩短时,这些点会从环上被删掉。

    接着,把“相邻两只羊之间的距离”定义成:沿着这个环,从一只羊走到下一只羊所经过的弧长。

    这样一来,这个模型和 n=2 n=2 时其实并没有本质区别。

    我们仍然只关心一件事:相邻两只羊之间的最大距离。

    于是和 n=2, m2105 n=2,\ m\le 2\cdot 10^5 时一样,有两种思路:

    • 直接模拟羊的运动,并在合适的时候裁剪,复杂度是 O(nm) O(nm)
    • 或者直接得出结论:答案为 x2+1 \dfrac{x}{2}+1
      其中 x x 是环上相邻两只羊之间的最大距离。

    完整解法:如何恢复方案

    n,m1000 n,m\le 1000 时,我们已经可以暴力求解,所以剩下的问题只有一个:在满分范围内如何构造具体方案。

    先把所有羊按它们在环上的位置排序。
    设存在某只羊 i i ,使得从羊 i i 到环上下一只羊的那段弧最长。

    那么恢复方案可以这样做:

    1. 重新编号,让羊 i i 变成最后一只羊。
    2. 先等待,直到最后一只羊在环上的位置变成 m1 m-1 (这里按 0 0 开始编号)。
      这等价于说:让它站到最后一列。
    3. 设从羊 n1 n-1 到羊 n n 的那段弧长为 d d
      为了删掉这段弧,只需要继续“转动”这个环,使得这只羊来到位置 m1+d2 m-1+\dfrac{d}{2} 。然后把线段长度减少 d2 \dfrac{d}{2} ,这样一来,第 n n 只羊就会重新站在位置 m1 m-1
    4. 接下来就可以忽略第 n n 只羊,继续处理第 n1 n-1 只羊,以此类推。

    不难发现,这个过程最终会删掉除了最长那段弧以外的所有弧,因此方案构造就是正确的。

    • 1

    信息

    ID
    12579
    时间
    1000ms
    内存
    700MiB
    难度
    10
    标签
    递交数
    1
    已通过
    1
    上传者