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 的边界处理。
相关推荐
从此以后自律1 小时前
迪杰斯特拉
算法
QiLinkOS1 小时前
第三视觉理解徐玉生与他的商业活动(32)
大数据·c++·人工智能·算法·开源协议
chushiyunen2 小时前
word使用笔记(二)、邮件合并(模板套用)
笔记·word
KaMeidebaby2 小时前
卡梅德生物技术快报|实操手册:CXCL4 蛋白原核表达全套工艺,两步层析去除蛋白多聚体附完整电泳数据
人工智能·算法·机器学习·架构·spark
AIGCmagic社区2 小时前
Unlimited OCR 论文精读:R-SWA 如何实现一次性长文档解析
人工智能·算法·aigc
鹏易灵2 小时前
C++——7.类与对象,掌握封装、继承、多态.详解
开发语言·c++·算法
Mortalbreeze2 小时前
深入 Linux 线程机制(三):线程互斥——竞争条件与互斥锁的本质
linux·运维·服务器·c++·算法
江华森2 小时前
Python 编程快速上手:让繁琐工作自动化 —— 19章全实战笔记
笔记·python·自动化
Mr_Controll2 小时前
【运动控制——电子凸轮曲线设计(多项式)】
算法·自动化
Sam09272 小时前
【AI 算法精讲 15】余弦相似度:向量检索与归一化内积
人工智能·python·算法·ai