蓝桥杯备考:前缀和算法---模板题

【模板】前缀和

蓝桥杯备考:前缀和算法---模板题_第1张图片蓝桥杯备考:前缀和算法---模板题_第2张图片

这道题,如果我们简单的用暴力解法,时间复杂度就是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 
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;
}

你可能感兴趣的:(蓝桥杯,职场和发展)