(简单的记录一下自己的刷题)
前缀和:为了优化循环的时间复杂度,将原本O(n)的复杂度变成O(1).
思路:定义一个前缀和数组prefix,一个数组用来存储数据。
每次循环 让prefix[i] = prefix[i-1] + a[i]
要求[l , r]区间的和,就是用prefix[r] - prefix[l - 1];
#include <bits/stdc++.h>
using namespace std;
const int N = 100010;
int n,m;
int prefix[N],a[N];
int main()
{
cin>>n>>m;
for(int i = 1; i <= n; i++)scanf("%d",&a[i]);
for(int i = 1; i <= n; i++)prefix[i] = prefix[i-1] + a[i];
while(m--)
{
int l,r;
scanf("%d %d",&l, &r);
printf("%d\n",prefix[r] - prefix[l-1]);
}
return 0;
}