2 条题解
-
0
对于给定的数组,我们先从一个子数组出发,如果当前 在当前子数组中出现的次数超过了 ,那么不管它是不是众数,当前子数组一定是合法子数组,因为就算当前 不是众数,众数也要超过 的出现次数。所以这个问题其实可以不用考虑众数。 我们考虑数字的贡献,对于当前位置 ,我们尝试找到一个最近(从左往右)的满足条件的左端点 ,使得数字 出现至少 次,对于这样的 ,我们可以取遍所有的 作为左端点,这些区间必定是符合条件的,即答案增加 。
代码实现:由于数据量为 ,我们用 map 离散化 , 用命名为 V 的 vector 存离散化后相同的数的下标,假设某个数字被离散化之后对应的数字是 ,那么 V[x] 就表示所有这个数字的出现下标。 这样我们只需要判断
V[x].size()
是否大于等于 就可以知道当前 是否出现次数不小于 ,对于这样的 ,他最近的 就是max(l,V[x][V[x].size()-k]
如果当前 不符合超过 次那么我们左端点依旧是上次的 ,因为可以作为上个合法子数组的最后一位,即贡献为l。
信息
- ID
- 44
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- (无)
- 递交数
- 56
- 已通过
- 10
- 上传者