【模板】前缀和_牛客题霸_牛客网 (nowcoder.com)
题目解释:
注意:下标从1开始的。
l 和 r就是对这n个整数去取一个区间,例如示例一:
(1,2) 区间 就是算出1 2 4 中 1,2下标对应值的和,1+2 = 3
同理,(2,3) -> 2 + 4 = 6
解法:前缀和
用来快速求出一段连续区间的和。
做法:
1.来一个dp数组(每个元素都是从[1,i] 位置元素的和):
求法: dp[i] = dp[i-1] + nums[i]
2.使用前缀和dp
既然要求(l,r) 区间的和,而dp数组已经有dp[r] 和dp[l-1]这一段的值了,所以dp[r] - dp[l-1]就可以算出(l,r)区间的值。
细节
为什么数组下标要从 1 开始?
因为如果说题目的 l 是可以 = 0的,那么求[0,2] 就是dp[2] - dp[-1]了,而下标怎么能为负数呢,所以此时需要单独处理判断,而下标从1开始的话,l最小 = 1 [1,2],就是 dp[2] - dp[0] 了,此时只需要让dp[0] = 0就可以了。
#include <iostream>
#include <vector>
using namespace std;int main()
{//1.把值输入到原始数组int n = 0,q = 0;cin >> n >> q;vector<int> arr(n+1);for(int i = 1;i<=n;i++)cin >> arr[i];//2.构建dp数组vector<long long int> dp(n+1);for(int i = 1;i<=n;i++)dp[i] = dp[i-1] + arr[i];//3.使用dp数组int l = 0,r = 0;while(q--){cin >> l >> r;cout << dp[r] - dp[l-1] <<endl;}
}