795. 前缀和

111 阅读1分钟

本题的目标是求解区间和,传统的思路是遍历数组来进行求解,那么如果是n次查询m大小的数组,那么最坏时间复杂度就变成了O(mn),因此需要一定的优化措施。

对于数组a:2,1,3,6,4来说,我们可以依次累加起来,得到2,3,6,12,16。经过预处理之后,当需要查询l到r之间的大小时,就是计算a[r] - a[l-1]的大小了。时间复杂度就变为了O(n)。

#include <iostream>
using namespace std;

const int N = 100010;

int arr[N];

int main() {
    int n, m;
    cin >> n >> m;
    
    for(int i = 1; i <= n; ++i) {
        cin >> arr[i];
        arr[i] += arr[i-1];
    }
    
    int l, r;
    while(m--) {
        cin >> l >> r;
        cout << arr[r] - arr[l-1] << endl;
    }
    
    return 0;
}