有一个显然的贪心,选了一个区间 ,贡献为这个区间的众数加上区间外的众数。
考虑根号分治,阈值为 。我们称出现次数 的数称为大数,反之成为小数。答案有需要分 类讨论: 内是大数/小数,区间外是大数/小数
比较简单的是 内是大数/小数,区间外是大数。
我们发现大数的种类只有 个,所以我们预处理出 表示前缀 数字 出现了多少次?这个部分容易做到 。
接下来我们枚举一种颜色,然后对于这个元素从左到右数的第 个出现位置假设我们的区间 以其为右端点,那么对于一个左端点 (这个元素第 个出现的位置)产生的贡献就是
推推柿子:
后面的 可以预处理啊,所以这部分可以做 。
十分困难的是 内是小数,区间外是小数。
因为区间内是小数,所以这样的区间只有 个,考虑 求区间外的小数,优势在于小数的数量 。
记录 表示左端点 要是需要出现 个元素,最靠右的右端点是多少?这个东西比较容易预处理,时间 。那么我们对于枚举的一个区间 ,我们找到 并且 尽量大。因为 数组有单调性,所以二分这个 。可以做到 。
看起来比较简单,但是没有那么好想。我想了半小时(可能是我菜)。
中规中矩的是 内是大数,区间外是小数。
下文中的 数组与上述定义一致。
我们对于一个左端点,枚举 ,所以需要找到 有多少个 ,我们记录了一个桶还记得吗,所以可以直接 算。
时间复杂度 。
综上所述,我们可以想一下 怎么取,当 的时候达到了最优,得出 。当 时, 可以取 ,此时理论运算量来到了 ,可以卡常通过。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 25岁的心里话
· 按钮权限的设计及实现