3.1——943F
943F#
限时每日一题day7。忘了在 \(map<vector>\) 上二分的 \(trick\)。大致思路没问题,就差这临门一脚。
先回顾一下在 \(map<vector>\) 上二分的 \(trick\):
- 原理:存储某个数在给定序列中的所有位置,进而可以通过在对应 \(vector\) 上二分来确定满足某些性质的位置。
- 复杂度:每次查找是 \(O(log^{2}n)\)(\(map\) 一个 \(log\),二分一个 \(log\))
可以简化一下问题:划分的段数一定可转化为 2 段或者 3 段(多出来的段可合并在一起,而异或和保持不变)。
只有 2 段时,当且仅当区间异或和为 0 时一定成立。
划分为 3 段,则显然 每一段的异或和 必然为 整段的异或和,设为 \(sum\)。相当于找:
- 满足 \(k1 >= l\) 的最小的 \(k1\),使得 \(a[l到k1]\) 的异或和为 \(sum\)。
- 满足 \(k2 <= r\) 的最大的 \(k2\),使得 \(a[k2到r]\) 的异或和为 \(sum\)。
- \(k1 < k2\)
由于 \(sum\) 的数量非常多,因此可以将上述思路转化成另一种形式:
- 满足 \(k1 >= l\) 的最小的 \(k1\),使得 \(a[k1到r]\) 的异或和为 \(0\)。
- 满足 \(k2 <= r\) 的最大的 \(k2\),使得 \(a[l到k2]\) 的异或和为 \(0\)。
- \(k1 <= k2\)
这样需要存储位置的数就只可能为 \(pre\) 与 \(suf\) 数组中的每个值,是 \(O(n)\) 的。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话