前缀和练习题

   2025年NOI大纲修订版中新添加了前缀和的概念,今天我们就来学习一下一维的前缀和概念以及应用方法。

定义 :一维前缀和数组 S,其中 S[i] 表示原数组 A 中从 A[0] 到 A[i] 的元素之和。例如, 数组 A = [2, 5, 7, 4]。

              前缀和数组 S = [2, 7, 14, 18]。

              求区间和:A[1]+a[2]= 5+7=12

              求区间和:S[2]-S[0] =14-2=12 

计算方法 :通过一个简单循环计算,初始化 S[0] = A[0],对于 i 从 1 开始,S[i] = S[i - 1] + A[i]。

用途 :快速求区间和。计算原数组 A 中从索引 i 到 j(i ≤ j)

的区间和可用公式 S[j] - S[i - 1](当 i > 0 时)。

求区间和

题目描述

      给定 n 个正整数组成的数列 a_1, a_2,.... a_n 和 m 个区间 [l_i,r_i],分别求这 m 个区间的区间和。

对于所有测试数据n,m<=10^5,a_i<=10^4

输入格式

      第一行,为一个正整数 n。

      第二行,为 n 个正整数 a_1,a_2,.....,a_n

      第三行,为一个正整数 m 。

      接下来 m 行,每行为两个正整数 l_i,r_i ,满足1<= l_i <= r_i <= n

输出格式

      共 m 行。

      第 i 行为第 i 组答案的询问。

输入输出样例 #1

输入 #1

     4

     4 3 2 1

     2

     1 4

     2 3

输出 #1

     10

     5

说明/提示

样例解释:第 1 到第 4 个数加起来和为 10。第 2 个数到第 3 个数加起来和为 5。

对于 50 % 的数据:n,m<= 1000;

对于 100 %的数据:1 <= n, m <= 10^5,1 <= a_i <= 10^4

解析:从题面意思很容易理解,m次操作,每次for范围【l,r】求和即可,不过注意到循环次数。极端情况下n=10^5,查询m次最大是10^5。容易超时,所以可以使用前缀和的概念。

#include<iostream>using namespace std;int n,m,a[100001],sum[100005],x,y; int main(){	cin>>n;for(int i=1;i<=n;i++){		cin>>a[i];		sum[i]=sum[i-1]+a[i]; //前缀和 	}	cin>>m;while(m--){//循环m次 		cin>>x>>y;		cout<<sum[y]-sum[x-1]<<endl;	}return 0;}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值