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

题目描述

小张开了一家小小的咖啡店,他习惯于记录每天的盈利状况。
盈利记为正数,亏损则记为负数。
经过一段时间的经营,他收集了连续 N 天的经营数据。
为了评估不同时段的经营效益,小张设定了一个“目标利润区间” [L, R] 。
他现在想知道,在这 N 天里,有多少个连续的经营周期(例如,从第 i 天到第 j 天),其总利润恰好落在了他设定的目标区间内?
这个问题对小张来说有些复杂,您能编程帮他快速统计出结果吗?

输入输出

输入描述
第一行 : 一个整数 N ,代表记录的总天数。
( 1 < N ≤ 10000 )
第二行 : N 个整数,代表一个数组 P ,其中 P_i 表示第 i 天的利润或亏损。
( -255 ≤ P_i ≤ 255 )
第三行 : 两个整数 L 和 R ,用空格隔开,代表目标利润区间的左右边界。
( -2550000 ≤ L ≤ R ≤ 2550000 )
输出描述
一个整数,表示总利润在区间 [L, R] 内的连续经营周期的总数量。

样例共 2 组

样例 1
输入
4
1 -1 1 -1
0 0
输出
4
样例 2
输入
3
-3 4 -2
-3 2
输出
5

算法解析依据充分

考点:前缀和

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

题目画像

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

解题思路

推荐方向:前缀和

本题切入点

区间和落入 [L,R] 的计数:记前缀和 S,对每个右端点 i 统计满足 L ≤ S_i−S_j ≤ R 的 j 个数,即统计 S_j ∈ [S_i−R, S_i−L] 的个数,用有序结构/桶统计。

预处理前缀和数组,把「区间求和」从 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 ≤ 1e4,只允许 O(n log n) 及更优,朴素 O(n²) 会超时。
  • 元素值域最大到 2550000 —— 求和 / 相乘时记得开 64 位整数。

样例

样例 1

  • 输入:4 / 1 -1 1 -1 / 0 0
  • 输出:4

样例 2

  • 输入:3 / -3 4 -2 / -3 2
  • 输出:5

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

本题来源:2025年秋招-华为-12月17号开发岗。

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