发布作者: ZHWEI
百度收录: 正在检测是否收录...
作品采用: 《 署名-非商业性使用-相同方式共享 4.0 国际 (CC BY-NC-SA 4.0) 》许可协议授权
一个数组sum 的第i个元素 = 数组a的第一个元素到第i个元素之和
定义一个数组a(不取索引为0的元素)
a[15] = {0,1,2,3,4,5,6,7,8,9,10};
定义一个数组sum 为数组a的前缀和数组
sum[15];
sum[1] = 1;
sum[2] = 1 + 2;
sum[3] = 1 + 2 + 3;
sum[4] = 1 + 2 + 3 + 4;
sum[5] = 1 + 2 + 3 + 4 + 5;
sum[15];
sum[1] = a[1];
sum[2] = a[1] + a[2];
sum[3] = a[1] + a[2] + a[3];
sum[4] = a[1] + a[2] + a[3] + a[4];
sum[5] = a[1] + a[2] + a[3] + a[4] + a[5];
通过
sum[1] = a[1];
sum[2] = a[1] + a[2];
sum[3] = a[1] + a[2] + a[3];
得:
sum[1] = a[1]
sum[2] = sum[1] + a[2];
sum[3] = sum[2] + a[3]
例如 我们需要求索引l~r区间内(包括l,r)的元素之和
和 = a[2] + a[3] + a[4]
∵
sum[1] = a[1];
sum[2] = a[1] + a[2];
sum[3] = a[1] + a[2] + a[3];
sum[4] = a[1] + a[2] + a[3] + a[4];
在以上内容中 a[2] + a[3] + a[4] = (a[1] + a[2] + a[3] + a[4]) - a[1] = a[2] + a[3] + a[4] = sum[4] - sum[1]
∴和 = sum[4] - sum[1]
和 = a[3] + a[4] + a[5]
∵
sum[1] = a[1];
sum[2] = a[1] + a[2];
sum[3] = a[1] + a[2] + a[3];
sum[4] = a[1] + a[2] + a[3] + a[4];
sum[5] = a[1] + a[2] + a[3] + a[4] + a[5];
在以上内容中 a[3] + a[4] + a[5] = (a[1] + a[2] + a[3] + a[4] + a[5]) -(a[1] + a[2]) = sum[5] - sum[2]
∴和 = sum[5] - sum[2]
AC代码
#include <bits/stdc++.h>
using namespace std;
int main()
{
int a[100005] , sum [100005];
sum[0] = 0;
int n , l , r;
cin >> n ;
for(int i = 1 ; i <= n ; i ++)
{
cin >> a[i];
sum[i] = sum[i - 1] + a[i];
}
while (cin >> l >> r)
cout << sum[r] - sum[l - 1];
return 0;
}
—— 评论区 ——