2026-01-21-牛客每日一题-静态区间和(前缀和)


title: 2026-01-21-牛客每日一题-静态区间和(前缀和)

date: 2026-01-21

tags:

  • 算法学习
  • 牛客
  • 前缀和

题目信息

  • 平台:牛客
  • 题目:【模板】静态区间和(前缀和)
  • 难度:简单(模板)
  • 题目链接

题目描述

给定长度为 n 的数组和 q 次查询,每次给出区间 l, r,输出该区间元素之和。数组不修改。


初步思路

1. 朴素做法

如果每次查询都直接遍历区间 [l, r] 求和,时间复杂度为 O(n)。对于 q 次查询,总时间复杂度为 O(nq)

2. 前缀和优化

我们需要快速求出区间和,利用前缀和 可以将区间查询优化到 O(1)

定义

pre[i] 表示数组前 i 个元素的和,即:
p r e i = a 1 + a 2 + ⋯ + a i prei = a1 + a2 + \dots + ai prei=a1+a2+⋯+ai

特别地,定义 pre[0] = 0

推导区间和

我们需要求区间 [l, r] 的和:
s u m ( l , r ) = a l + a l + 1 + ⋯ + a r sum(l, r) = al + al+1 + \dots + ar sum(l,r)=al+al+1+⋯+ar

我们可以用 pre[r] 减去 pre[l-1] 来得到:

  • pre[r] 包含了 a[1]...a[r]
  • pre[l-1] 包含了 a[1]...a[l-1]
  • 相减后,1l-1 部分着消,剩下 lr 部分。

公式
s u m ( l , r ) = p r e r − p r e l − 1 sum(l, r) = prer - prel-1 sum(l,r)=prer−prel−1

3. 一个例子

以数组 a = [1, 2, 3, 4, 5] 为例:

  • pre[3] = 1 + 2 + 3 = 6
  • pre[1] = 1

我们要求区间 [2, 3] 的和,即 a[2] + a[3] = 2 + 3 = 5

根据公式 sum(2, 3) = pre[3] - pre[1]
pre 3 = 1 + 2 + 3 pre 1 = 1 pre 3 − pre 1 = ( 1 + 2 + 3 ) − ( 1 ) = 2 + 3 = 5 \begin{aligned} \text{pre}3 &= 1 + 2 + 3 \\ \text{pre}1 &= 1 \\ \text{pre}3 - \text{pre}1 &= (1 + 2 + 3) - (1) \\ &= 2 + 3 \\ &= 5 \end{aligned} pre3pre1pre3−pre1=1+2+3=1=(1+2+3)−(1)=2+3=5

4. 复杂度

  • 预处理:O(n)
  • 每次查询:O(1)
  • 总时间复杂度:O(n + q)

算法分析

  • 核心:前缀和转化区间求和
  • 技巧:pre0 = 0,使用 long long 防止溢出
  • 时间复杂度:O(n + q)
  • 空间复杂度:O(n)

代码实现(C++)

cpp 复制代码
#include <iostream>
#include <vector>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, q;
    cin >> n >> q;

    vector<long long> pre(n + 1, 0);
    for (int i = 1; i <= n; ++i) {
        long long x;
        cin >> x;
        pre[i] = pre[i - 1] + x;
    }
    while (q--) {
        int l, r;
        cin >> l >> r;
        cout << pre[r] - pre[l - 1] << '\n';
    }
    return 0;
}

总结与反思

  1. 静态区间和用前缀和是最直接且高效的模板解法。
  2. 注意区间下标从 1 开始时,pre 的边界处理。
相关推荐
ji198594436 分钟前
MATLAB 求散点曲线斜率
开发语言·算法·matlab
kaikaile199511 分钟前
MATLAB 实现:Koch & Zhao 图像水印算法(DCT域)
开发语言·算法·matlab
QiLinkOS14 分钟前
QiLink开源生态的三维重构:基于时间、空间与社会价值的底层规则创新白皮书
大数据·c++·人工智能·科技·算法·gitee·开源
牛肉在哪里20 分钟前
ros2 从零开始28 监听广播C++
开发语言·c++·算法·机器人
chase。23 分钟前
【学习笔记】Unified World Models:基于视频-动作耦合扩散的机器人预训练新范式
笔记·学习·音视频
乐观勇敢坚强的老彭25 分钟前
GESP一级核心算法:循环与条件判断的结合
java·数据结构·算法
noipp28 分钟前
推荐题目:洛谷 P1737 [NOI2016] 旷野大计算
linux·数据结构·算法
QiLinkOS39 分钟前
极客精神与商业思维的融合实践(2)
c语言·c++·人工智能·算法·开源协议
影寂ldy1 小时前
C# 事件完整学习笔记(发布订阅 + 自定义事件 + 内置 EventHandler)
笔记·学习·c#
code_pgf1 小时前
改进模型架构来减少MLLMs中的幻觉现象
人工智能·深度学习·算法