【模板】前缀和
这道题,如果我们简单的用暴力解法,时间复杂度就是O(q*N)也就是10的十次方,这时候我们就会超时
我们要学习一种前缀和的算法,它能帮助我们做一些预处理,用空间复杂度代替时间复杂度,比如说这道题,我们开辟一个数组,f[N],我们只需要一个公式f[i]=f[i-1]+a[i]就能完成我们的预处理,最后查询的时间复杂度就是O(1)了,比如我们要查询l到r的和,我们就让f[r]-f[l-1],不理解的话我们就举个例子 ,比如 数组1 6 6 5 我们要搜下标2到3的和,就需要前三个的和也就是l[r]减去前1个元素的和也就是f[l-1]
我们来实现一下代码
#include <iostream>
using namespace std;
const int N = 1e5+10;
typedef long long LL;
LL a[N],f[N];
int main()
{int n,q;cin >> n >> q;for(int i = 1;i<=n;i++) cin >> a[i];for(int i = 1;i<=n;i++) f[i] = f[i-1]+a[i];while(q--){int l,r;cin >> l>>r;cout << f[r] - f[l-1] << endl;}return 0;
}