前缀和
前缀和的题目一般形如
如果使用暴力算法,对每一对的l, r都从a[l]开始加到a[r],那么可能会导致超时,其实我们可以另外再弄一个数组S,其中的元素S[i]就代表从a[0]到a[i]的元素和,这样我们要计算a中l到r只需要计算S[r] - S[l - 1]即可,这里要注意一点就是在存储a的时候,下标从1开始,这样比较方便,不需要特判,计算S的时候也从1开始计算即可。如果a从下标为0的地方开始存储,那么S[i]=S[i-1]+a[i]这个公式用起来就会非常不方便。具体代码如下:
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 100010;
int n, m, l, r;
int a[N], s[N];
int main()
{
cin >> n >> m;
for(int i = 1; i <= n; i ++) cin >> a[i];
for(int i = 1; i <= n; i ++) s[i] = s[i - 1] + a[i];
while(m --)
{
cin >> l >> r;
cout << s[r] - s[l - 1] << endl;
}
return 0;
}