华为 · 前缀和 · 算法编程题
华为 前缀和 N ≤ 1e5 时限 3 秒 / 256 MB

题目描述

小红经营着一家创意烘焙坊,店内共有 N 种编号为 0 ... N-1 的不同款式慕斯模具。在今天的生产流水线上,小红记录了 M 次模具的使用信息。第 m 次记录显示,在时间点 j_m 使用了编号为 i_m 的模具。
为了优化清洗流程,小红提出了 K 个查询。每个查询由一个起始时间 S_k 和一个固定的时间跨度 X 组成,代表观察的时间区间为 [S_k, S_k + X - 1] (闭区间)。对于每个查询,小红想知道在这个时间区间内,使用了多少种不同编号的模具。

输入输出

输入描述
第一行包含三个整数 N, X, K ( 1 ≤ N, X, K ≤ 10^5 ),分别表示模具的总数、查询的时间跨度长度以及查询的数量。
第二行包含 K 个整数 S_1, S_2, ..., S_K ( 0 ≤ S_k ≤ 10^5 ),表示每个查询区间的起始时间。
第三行包含一个整数 M ( 1 ≤ M ≤ 10^5 ),表示模具的使用记录总数。
接下来的 M 行,每行包含两个整数 i_m 和 j_m ( 0 ≤ i_m < N, 0 ≤ j_m ≤ 10^5 ),表示在时间 j_m 使用了编号为 i_m 的模具。
输出描述
输出一行 K 个整数,每两个整数之间用空格分隔,依次对应每个查询区间内不同模具的种类数。

样例共 1 组

样例 1 · - 对于第一个查询,时间区间为 [3, 4] 。在该区间内,模具 2 分别在时间 3 和时间 4 被使用。因此,不同模具的数量为 1(仅有模具 2)。 - 对于第二个查询,时间区间为 [4, 5] 。在该区间内,模具 2 在时间 4 被使用,模具 3 在时间 5 被使用。因此,不同模具的数量为 2(模具 2 和模具 3)。
输入
4 2 2
3 4
4
2 4
2 3
1 2
3 5
输出
1 2

算法解析依据充分

考点:前缀和

数据规模 N ≤ 1e5 | 限制 3 秒 / 256MB | 标准输入输出

题目画像

  • 数据规模:N ≤ 1e5,K ≤ 1e5,M ≤ 1e5
  • 元素值域:X ≤ 1e5,S_k ≤ 1e5,j_m ≤ 1e5(注意整数类型选择,避免溢出)
  • 复杂度门槛:只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 源站时限:3 秒(牛客口径,非本题专属门槛)

解题思路

推荐方向:前缀和

本题切入点

查询区间固定长度 X 的不同模具种类数:对每个种类算出它能贡献的起始时间区间(左端点范围),用差分数组累加,查询时 O(1) 取值。

预处理前缀和数组,把「区间求和」从 O(n) 降到 O(1)。

思路框架(前缀和 通法 · 非本题专属)

  1. 预处理 pre[i] = a[1]+...+a[i]。
  2. 区间 [l, r] 的和 = pre[r] - pre[l-1]。
  3. 若题目是「多次区间修改 + 最后统一查询」,改用差分数组:d[l]+=v, d[r+1]-=v,最后做一遍前缀和还原。
  4. 二维情况用二维前缀和(容斥原理)。

实现要点:开 long long,避免 n 较大时求和溢出。

复杂度:时间 预处理 O(n),每次查询 O(1) | 空间 O(n)

该范式的通法易错点

  • pre 数组下标没留出 0 号位导致 l-1 越界。
  • 求和结果超出 int 范围(1e5 个 1e9 相加会溢出 32 位整数)。

对照本题

  • 数据规模 N ≤ 1e5,只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 元素值域最大到 1e5 —— 求和 / 相乘时记得开 64 位整数。

样例解读

样例 1:输入 4 2 2 / 3 4 / 4 / 2 4 / 2 3 / 1 2 / 3 5 → 输出 1 2

  • 对于第一个查询,时间区间为 [3, 4] 。在该区间内,模具 2 分别在时间 3 和时间 4 被使用。因此,不同模具的数量为 1(仅有模具 2)。
  • 对于第二个查询,时间区间为 [4, 5] 。在该区间内,模具 2 在时间 4 被使用,模具 3 在时间 5 被使用。因此,不同模具的数量为 2(模具 2 和模具 3)。

解析由校招宝本地引擎整理(依据源站考点标签 / 人工判题标注 / 题面规模信号),非官方题解,仅供思路参考。

本题来源:2026年-华为-1月22号开发岗。

‹ 上一题 全部编程题 下一题 ›
编程算法题为只读内容:无需作答,直接看题与解析 · 本站不提供在线判题 · 解析由校招宝本地引擎整理,非官方题解