1 条题解
-
0
题目回顾
给定数组 ,元素均为正整数。
$$\text{score} = \max(\text{红色元素}) + \min(\text{红色元素}) + \text{红色元素个数} $$
可以选一些位置染红,要求不能有相邻红位置。
得分定义为:求最大可能得分。
第一步:最优解必然包含全局最大值
设全局最大值为 。
假设某个最优解中,红色元素的最大值 。
那么我们可以加入任意一个值为 的位置(如果相邻位置有红,则删掉那个红,最多删 个)。
这样变化后:- 最大值从 变成 ,增加了 。
- 元素个数最多减少 。
- 最小值不变或可能变大(如果删掉的是最小值,最小值可能变大,但不会让分数变小)。
所以新分数 旧分数 。
当 时,新分数严格更大;当 时,新分数至少不变。
因此最优解中一定存在某个红色元素等于 。
第二步:枚举最小值 ,维护可选区间
设 固定。
我们考虑所有 的位置。
这些位置被允许选,并且它们必须包含至少一个 。问题转化为:
在数组的某些位置()中选一个子集,不能相邻,必须包含至少一个 ,最大化:
因为 固定,我们要最大化 。
第三步:对每个 ,如何计算最大可选个数?
允许的位置把数组分成若干连续段(connected components)。
在一个长度为 的连续段中,不能相邻选,最多选 个。那么如果不考虑必须选 ,总个数为:
$$\text{total}(l) = \sum_{\text{每个段}} \lceil \text{段长} / 2 \rceil $$
第四步:保证至少选一个
如果某个段里包含 ,那么选 个时,可能包含 ,也可能不包含。
能不能保证包含 ?关键观察:
- 在一个段里,如果固定选 个,有两种“极值”选法:
从第一个位置开始选(奇偶性 1),或者从第二个位置开始选(奇偶性 2)。 - 一个段里的某个具体位置 (从段头数第 个)能被包含在“最多选”方案中,当且仅当:
要么选奇数位置,要么选偶数位置,并且 属于被选的那一组。
因此:
- 如果 在某个段里,并且它可以在奇数位置被选到(即段头到它的距离是偶数,从 开始计),则这个段可以通过选择奇数位置来包含 。
- 同样,如果 在偶数位置被选到(距离是奇数),则选偶数位置即可包含 。
所以对于包含 的段,有两种选法(奇/偶)。
我们要看:是否存在一个段,使得它的两种选法之一同时满足:- 该段选了 个元素(最大个数)。
- 包含 。
第五步:维护两个布尔值
对每个段,维护:
can_odd:是否可以通过选奇数位置(从段头 1 开始)包含 。can_even:是否可以通过选偶数位置包含 。
如果某个段里, 出现在奇数位置(段内索引从 1 开始),那么
can_odd = true;
如果出现在偶数位置,那么can_even = true。
(注意:如果段里 出现多次,可能两个都 true。)
第六步:全局判断能否包含
若所有段中,奇数选法都不包含 ,且偶数选法也都不包含 ,则必须放弃一个段的一个元素来换 ,总个数减 1。
否则,我们可以选择一种选法(奇或偶),使得每个段都取 ,且至少一个段包含了 。
第七步:枚举 的过程
我们从大到小枚举 (从 往下到最小值),同时维护 DSU(并查集)来合并相邻的“可选”段。
当 减小时,新加入一些位置 ,这些位置可能:
- 单独成一个段,
- 或连接左右两个段(如果它们已经是可选状态)。
每次合并时更新:
- 段长
can_odd和can_even(根据 在当前段内的位置合并)
然后计算:
$$\text{score}(l) = r + l + \text{total}(l) - \delta $$其中 如果“无法在保持最大个数下包含 ”,否则 。
第八步:复杂度
每个位置被加入一次,合并用 DSU 并查集,总复杂度 。
最终算法步骤
- 找到全局最大值 。
- 按值从大到小枚举 (去重)。
- 维护一个布尔数组
active,标记 。 - 当 减小,新激活的位置尝试与左右合并(DSU)。
- 每个 DSU 节点维护:
- 段长
has_r_odd:段内是否存在 在奇数位置(从段头 1 开始数)has_r_even:段内是否存在 在偶数位置
- 全局维护:
total_odd:所有段的奇数选法的总数(即 )total_even:所有段的偶数选法的总数(其实等于total_odd,因为 与奇偶无关,但区别在于包含 的可能性)
- 全局检查:是否存在一个段,其
has_r_odd = true,或者has_r_even = true?
若没有,则答案 ;
否则 。 - 取所有 的最大值。
示例验证(第三组数据)
数组:,。
- 当 :只有 一个元素,段长 1,可选 1 个,包含 ,得分 。
- 当 :可选 ,位置 5 的 4 和位置 10 的 4 与位置 9 的 5 形成两个段? 不对,检查:
激活位置:5(4), 9(5), 10(4) → 实际上位置 5 与位置 9 不相邻,所以段是 [5] 和 [9,10]。
段1: [5] 长1 → 可选1, 不在。
段2: [9,10] 长2 → 可选1(奇数选法取9,偶数取10), 在 9(奇数位),所以has_r_odd=true。
总数=1+1=2,可以包含 ,得分=5+4+2=11。 - 当 :激活很多,计算得最大 12。
最终答案 12,匹配样例。
总结
本题核心:
- 固定最大值 必选。
- 枚举最小值 ,用 DSU 维护可选段。
- 每个段最多选 个,奇偶两种选法。
- 检查是否能包含 ,不能则总个数减 1。
- 取 。
复杂度 或 ,可以过 。
- 1
信息
- ID
- 6275
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 2
- 已通过
- 1
- 上传者