1 条题解
-
0
D. 生日礼物 详细题解
题目核心理解
给定一个长度为 的数组 和一个整数 。 需要把数组恰好划分成 个连续、不重叠、覆盖全部的子段,满足:
- 第一段从 开始,最后一段到 结束。
- 每一段内部求异或和。
- 把所有段的异或和再做一次按位或,结果 。
求能满足条件的最大 ,如果不存在合法划分则输出 。
核心思路
1. 关键性质
- 按位或只会只增不减,因此高位约束更强,适合从高位到低位贪心构造。
- 我们要构造一个掩码 ,使得所有分段的异或和满足:
- 尽可能在每一个满足条件的位置立即分段,这样得到的段数 最大。
2. 判定规则
对一个固定掩码 ,判断是否存在合法划分:
- 遍历数组,维护当前段异或和 。
- 每加入一个数:。
- 若 ,则在此处分段,计数 ,并清空 。
- 遍历结束后,若 且划分完成,则返回段数;否则返回 。
3. 掩码构造
从高位到低位(第 位到第 位)依次尝试:
- 尝试将当前位加入掩码。
- 如果新掩码仍然可以合法划分,则保留该位。
- 否则不保留,继续处理下一位。
算法流程
- 初始化掩码 。
- 从第 位到第 位逐位尝试加入掩码,并检查是否仍可合法划分。
- 用最终得到的掩码再跑一次贪心分段。
- 输出得到的最大段数,无法划分则输出 。
公式与复杂度分析
合法分段条件:
复杂度
- 逐位构造掩码:
- 单次贪心遍历:
- 总时间复杂度:
可轻松处理 、多组数据 的范围。
- 1
信息
- ID
- 6569
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者