795. 前缀和(acwing)

文章目录

795.前缀和

题目描述

输入一个长度为n的整数序列。

接下来再输入m个询问,每个询问输入一对l, r。

对于每个询问,输出原序列中从第l个数到第r个数的和。

输入格式

第一行包含两个整数n和m。

第二行包含n个整数,表示整数数列。

接下来m行,每行包含两个整数l和r,表示一个询问的区间范围。

输出格式

共m行,每行输出一个询问的结果。

数据范围

1≤l≤r≤n,

1≤n,m≤100000,

-1000≤数列中元素的值≤1000

输入样例:

复制代码
5 3
2 1 3 6 4
1 2
1 3
2 4

输出样例:

复制代码
3
6
10

前缀和

这段代码是用来解决前缀和问题的,用于快速计算区间内所有数的和。下面是详细注释:

cpp 复制代码
#include<bits/stdc++.h> // 包含大部分常用的库
using namespace std;
const int z=100010; // 定义常量z为100010,作为数组大小的上限

int a[z],s[z]; // a是输入的数列,s是前缀和数组

int main() {
    int n,m,i; // n是数列的长度,m是查询的次数,i是循环变量
    scanf("%d %d",&n,&m); // 读入n和m
    for(i=1;i<=n;i++)
        scanf("%d",&a[i]); // 读入数列,存入a数组
    for(i=1;i<=n;i++)
        s[i]=s[i-1]+a[i]; // 计算前缀和,s[i]存的是a[1]到a[i]的和

    while(m--) // 循环m次,对每个查询进行处理
    {
        int l,r;
        scanf("%d %d",&l,&r); // 读入查询的区间[l, r]
        printf("%d\n",s[r]-s[l-1]); // 输出区间和,即s[r]减去s[l-1]的值
    }
    return 0;
}

这段代码的核心是前缀和的概念。前缀和是一个非常有用的工具,特别是当我们需要频繁地查询某个区间内的元素和时。

前缀和数组s是这样定义的:si表示从a1到ai的元素和。这意味着,为了得到任意区间l,r的和,我们可以用sr(包含从a1到ar的所有元素的和)减去sl-1(包含从a1到al-1的所有元素的和)。这样就可以在O(1)的时间内得到任意区间的和,而不必每次询问都遍历整个区间,这在处理大量数据时非常有效率。

注意:本代码中的数组从索引1开始,而不是通常的从索引0开始,因此当计算前缀和时,s0默认为0。这也是为什么在计算区间和时使用sr-sl-1而不是sr-sl。如果l为1,sl-1为s0,表示没有元素的和,即为0。

相关推荐
C+-C资深大佬9 分钟前
C++ 中的 constexpr与 const区
java·开发语言·c++
8Qi811 分钟前
LeetCode 4:寻找两个正序数组的中位数 —— 二分查找法
java·算法·leetcode·职场和发展·二分查找
8Qi815 分钟前
LeetCode 32:最长有效括号 —— 栈 + 标记法 题解
java·数据结构·算法·leetcode·职场和发展··括号匹配
机器学习之心17 分钟前
198种组合算法+优化CNN-LSTM+SHAP分析+新数据预测+多输出!深度学习可解释分析,强烈安利,粉丝必备
深度学习·算法·cnn-lstm·shap分析·198种组合算法
Tairitsu_H17 分钟前
[LC优选算法#3] 滑动窗口 | 将x减到0的最⼩操作数 | ⽔果成篮 | 字⺟异位词
c++·算法·leetcode·滑动窗口
c++之路22 分钟前
CMake 系列教程(一):CMake 基础知识
c语言·开发语言·c++
bIo7lyA8v24 分钟前
算法复杂度与能耗关系的多变量分析研究的技术8
算法
Irissgwe26 分钟前
C++ STL bitset 和位图详解
开发语言·c++·stl·位图·bitset
洛水水1 小时前
【力扣100题】76.搜索插入位置
数据结构·算法·leetcode
Techblog of HaoWANG1 小时前
智巡守卫:多模态巡检智能体算法服务端设计与实现——基于Ollama+Qwen3.5的自动化巡检报告生成系统
运维·人工智能·算法·目标检测·自动化·边缘计算