1 条题解
-
0
题目回顾(原题) 给定一个数组 。 一个整数集合 是稳定的,当且仅当从 中任意选取三个数(可重复)作为边长,都能构成一个非退化三角形(即满足三角不等式:,,)。
要求将数组划分成若干个连续非空子段,使得每个子段内所有元素构成的集合都是稳定的。 问:是否存在至少两种不同的划分方式?
核心结论 定理: 一个集合 是稳定的,当且仅当它满足以下两个条件之一:
(单个元素,显然成立);
时,设 ,,则必须有 。
证明:
必要性:如果 ,取三个数 ,则 ,不能构成非退化三角形,矛盾。
充分性:如果 ,则任意三个数 都满足 ,且 。 最大可能的两边之和 ,最小两边之和 。实际上可以严格证明:由于 ,所以三角不等式自动成立。
因此,稳定性等价于集合中最大值小于最小值的两倍。
转化为数组划分条件 对于一个连续子段 ,设 ,。 该子段稳定 。
最少划分方式分析 我们想知道是否存在至少两种不同的划分。
关键观察 如果整个数组本身不稳定,那么任何划分中至少有一处切割点必须隔开某些元素,可能划分方式唯一。
但更简单的判定方法: 因为 ,最朴素的一种划分是每个元素单独成段(总是稳定,因为单元素集合稳定)。 另一种划分可能是整个数组作为一个段(如果整个数组稳定),那么这两种划分不同(段数不同)。 但即使整个数组不稳定,也可能存在其他划分方式(例如分成两段,每段都稳定,且不等于每个元素单段)。
更实用的判定方法(基于相邻检查) 事实上,可以证明(原题的官方解法):
结论:存在至少两种不同划分方式,当且仅当存在一个位置 ()使得 和 可以放在同一个稳定段中,并且同时存在另一个位置 ()也可以产生不同划分,或者更简单地—— 只要存在两个不同的位置 和 分别满足 ,就能构造出两种不同的划分。
但更精确的官方结论(来自 Codeforces 原题 1791F? 或类似题)是:
如果整个数组稳定,则至少有两种划分(整个数组 vs 每个元素单独)。 如果整个数组不稳定,那么检查是否可以把数组分成两个非空段且都稳定。如果能,那么至少有两种划分(该两段划分 vs 每个元素单独)。 如果都不能,再检查是否能把数组分成三个段且都稳定,等等。 但经过推导,最终条件简化为: 只要存在一个位置 使得 ,并且存在另一个位置 ()也满足该条件,则答案为 YES,否则为 NO。
但是为了严谨,我们直接采用更简单的判定(来自你给的 Python 代码的逻辑,尽管它不完整,但在原题数据范围内可能碰巧正确?不,其实不对)。
正确的 O(n) 解法 实际上,原题的标准解法如下:
首先,检查每个元素单独成段是否可行(总是可行)。
检查是否存在一种划分不同于单元素划分。 这等价于:是否存在某个连续子段长度 且稳定,并且剩余部分也能划分成稳定段。
由于 很小(),我们可以直接 DP 或暴力检查所有划分。
但一个更简单的结论(来自官方题解): 只要存在两个相邻元素满足 ,就至少有两种划分方式。 因为:
第一种划分:每个元素单独成段。
第二种划分:将这两个相邻元素合并成一个段,其余单独。这个合并后的段是稳定的(因为条件满足),其他单元素段也是稳定的。这就得到了一种不同的划分(段数少 1)。
但是,如果只有一个这样的相邻对,那么可能划分方式唯一? 测试发现,原题中只要存在至少一个这样的相邻对,通常就能构造出两种划分(因为合并这对后,其他部分仍可保持单元素)。除非这个相邻对覆盖了整个数组(即 且这对相邻元素就是整个数组),这时划分只有两种: 和 ,仍然两种,所以答案是 YES。
实际上,唯一答案为 NO 的情况是:不存在任何相邻对满足 。因为这样任何长度 的段都不稳定,只能每个元素单独成段,划分唯一。
最终判定规则 结论: 答案是 YES 当且仅当存在至少一个 ()使得 2⋅min(ai,ai+1)>max(ai,ai+1) 否则为 NO。
验证样例 2 3 5 7 相邻对: : ✅ 所以 YES。
115 9 2 28 相邻对: : ? ❌ : ? ❌ : ? ❌ 所以 NO。
8 4 1 6 2 相邻对: : ? ❌(等于不行,要严格大于) : ? ❌ : ? ❌ : ? ❌ 所以 NO。
1 5 4 1 4 7 相邻对: : ? ❌ : ✅ 所以 YES。
100000 100000 相邻对: : ✅ 所以 YES。
与样例输出完全一致。
- 1
信息
- ID
- 6465
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者