1 条题解
-
0
题意
有两个数组 (长度 )和 (长度 ),问 有多少个长度为 的连续子数组能与 匹配。
匹配的定义:两个数组的数可以一一配对,每对 满足 。
核心思路
这是一个贪心匹配问题。
最优的匹配方法是:
将 从小到大排序,将 的子数组也从小到大排序,然后最小配最小,次小配次小,……,如果每一对都满足 ,则匹配成功。
快速判断
我们不需要真的排序每个子数组并检查,这样太慢()。
可以这样优化:- 将 排序。
- 对于 的某个子数组,我们想知道:排序后是否满足 对所有 成立。
- 等价于:对于每个 ,在子数组中至少有 个数 (因为排序后第 小的 必须 )。
转换问题
定义 (注意 已排序,所以 是降序的)。
条件变为:子数组中 的数的个数 (对 )。
进一步简化
其实只需要检查:对于每个 ,子数组中 的数的个数 。
但 增大时 减小,条件自动满足吗?
不,因为 增大时要求个数更多,但 减小,所以可能更容易满足。
实际上,只需要检查最严格的条件:
对于每个 (),子数组中 的数的个数 。
实现方法
- 将 排序,计算 (反转一下,让 升序)。
- 这样条件变成:子数组中 的数的个数 ()。
- 用线段树或 Fenwick 树维护 中每个值出现的次数,滑动窗口时更新。
- 对每个 ,检查当前窗口 的数量是否 ,如果所有 都满足,则答案加一。
复杂度
排序 ,滑动窗口 ,每次检查 个条件,直接做是 ,但可以优化到 用二分或树维护。
最终答案就是满足条件的子数组个数。
- 1
信息
- ID
- 3361
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 10
- 标签
- 递交数
- 1
- 已通过
- 1
- 上传者