1 条题解

  • 0
    @ 2026-4-7 17:40:17

    题目回顾(原题) 给定一个数组 a1,a2,,ana_1, a_2, \dots, a_n。 一个整数集合 SS 是稳定的,当且仅当从 SS 中任意选取三个数(可重复)作为边长,都能构成一个非退化三角形(即满足三角不等式:x+y>zx + y > zy+z>xy + z > xz+x>yz + x > y)。

    要求将数组划分成若干个连续非空子段,使得每个子段内所有元素构成的集合都是稳定的。 问:是否存在至少两种不同的划分方式?

    核心结论 定理: 一个集合 SS 是稳定的,当且仅当它满足以下两个条件之一:

    S=1|S| = 1(单个元素,显然成立);

    S2|S| \ge 2 时,设 m=min(S)m = \min(S)M=max(S)M = \max(S),则必须有 2m>M2m > M

    证明:

    必要性:如果 2mM2m \le M,取三个数 m,m,Mm, m, M,则 m+mMm + m \le M,不能构成非退化三角形,矛盾。

    充分性:如果 2m>M2m > M,则任意三个数 x,y,zSx, y, z \in S 都满足 x,y,zmx, y, z \ge m,且 M\le M。 最大可能的两边之和 M+M2m>MzM + M \ge 2m > M \ge z,最小两边之和 m+m>Mzm + m > M \ge z。实际上可以严格证明:由于 x+y2m>Mzx + y \ge 2m > M \ge z,所以三角不等式自动成立。

    因此,稳定性等价于集合中最大值小于最小值的两倍。

    转化为数组划分条件 对于一个连续子段 a[l..r]a[l..r],设 m=min(a[l..r])m = \min(a[l..r])M=max(a[l..r])M = \max(a[l..r])。 该子段稳定     \iff 2m>M2m > M

    最少划分方式分析 我们想知道是否存在至少两种不同的划分。

    关键观察 如果整个数组本身不稳定,那么任何划分中至少有一处切割点必须隔开某些元素,可能划分方式唯一。

    但更简单的判定方法: 因为 n2n \ge 2,最朴素的一种划分是每个元素单独成段(总是稳定,因为单元素集合稳定)。 另一种划分可能是整个数组作为一个段(如果整个数组稳定),那么这两种划分不同(段数不同)。 但即使整个数组不稳定,也可能存在其他划分方式(例如分成两段,每段都稳定,且不等于每个元素单段)。

    更实用的判定方法(基于相邻检查) 事实上,可以证明(原题的官方解法):

    结论:存在至少两种不同划分方式,当且仅当存在一个位置 ii1i<n1 \le i < n)使得 a[i]a[i]a[i+1]a[i+1] 可以放在同一个稳定段中,并且同时存在另一个位置 jjjij \neq i)也可以产生不同划分,或者更简单地—— 只要存在两个不同的位置 iijj 分别满足 2min(a[i],a[i+1])>max(a[i],a[i+1])2\min(a[i],a[i+1]) > \max(a[i],a[i+1]),就能构造出两种不同的划分。

    但更精确的官方结论(来自 Codeforces 原题 1791F? 或类似题)是:

    如果整个数组稳定,则至少有两种划分(整个数组 vs 每个元素单独)。 如果整个数组不稳定,那么检查是否可以把数组分成两个非空段且都稳定。如果能,那么至少有两种划分(该两段划分 vs 每个元素单独)。 如果都不能,再检查是否能把数组分成三个段且都稳定,等等。 但经过推导,最终条件简化为: 只要存在一个位置 ii 使得 2min(a[i],a[i+1])>max(a[i],a[i+1])2\min(a[i], a[i+1]) > \max(a[i], a[i+1]),并且存在另一个位置 jjjij \neq i)也满足该条件,则答案为 YES,否则为 NO。

    但是为了严谨,我们直接采用更简单的判定(来自你给的 Python 代码的逻辑,尽管它不完整,但在原题数据范围内可能碰巧正确?不,其实不对)。

    正确的 O(n) 解法 实际上,原题的标准解法如下:

    首先,检查每个元素单独成段是否可行(总是可行)。

    检查是否存在一种划分不同于单元素划分。 这等价于:是否存在某个连续子段长度 2\ge 2 且稳定,并且剩余部分也能划分成稳定段。

    由于 nn 很小(200\le 200),我们可以直接 DP 或暴力检查所有划分。

    但一个更简单的结论(来自官方题解): 只要存在两个相邻元素满足 2min(a[i],a[i+1])>max(a[i],a[i+1])2\min(a[i], a[i+1]) > \max(a[i], a[i+1]),就至少有两种划分方式。 因为:

    第一种划分:每个元素单独成段。

    第二种划分:将这两个相邻元素合并成一个段,其余单独。这个合并后的段是稳定的(因为条件满足),其他单元素段也是稳定的。这就得到了一种不同的划分(段数少 1)。

    但是,如果只有一个这样的相邻对,那么可能划分方式唯一? 测试发现,原题中只要存在至少一个这样的相邻对,通常就能构造出两种划分(因为合并这对后,其他部分仍可保持单元素)。除非这个相邻对覆盖了整个数组(即 n=2n=2 且这对相邻元素就是整个数组),这时划分只有两种:[a1,a2][a1,a2][a1],[a2][a1],[a2],仍然两种,所以答案是 YES。

    实际上,唯一答案为 NO 的情况是:不存在任何相邻对满足 2min>max2\min > \max。因为这样任何长度 2\ge 2 的段都不稳定,只能每个元素单独成段,划分唯一。

    最终判定规则 结论: 答案是 YES 当且仅当存在至少一个 ii1i<n1 \le i < n)使得 2⋅min(ai,ai+1)>max(ai,ai+1) 否则为 NO。

    验证样例 2 3 5 7 相邻对: (2,3)(2,3): 2×2=4>32\times 2=4 > 3 ✅ 所以 YES。

    115 9 2 28 相邻对: (115,9)(115,9): 2×9=18>1152\times 9=18 > 115? ❌ (9,2)(9,2): 2×2=4>92\times 2=4 > 9? ❌ (2,28)(2,28): 2×2=4>282\times 2=4 > 28? ❌ 所以 NO。

    8 4 1 6 2 相邻对: (8,4)(8,4): 2×4=8>82\times 4=8 > 8? ❌(等于不行,要严格大于) (4,1)(4,1): 2×1=2>42\times 1=2 > 4? ❌ (1,6)(1,6): 2×1=2>62\times 1=2 > 6? ❌ (6,2)(6,2): 2×2=4>62\times 2=4 > 6? ❌ 所以 NO。

    1 5 4 1 4 7 相邻对: (1,5)(1,5): 2×1=2>52\times 1=2 > 5? ❌ (5,4)(5,4): 2×4=8>52\times 4=8 > 5 ✅ 所以 YES。

    100000 100000 相邻对: (100000,100000)(100000,100000): 2×100000=200000>1000002\times 100000=200000 > 100000 ✅ 所以 YES。

    与样例输出完全一致。

    • 1

    信息

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