本题的目标是求解区间和,传统的思路是遍历数组来进行求解,那么如果是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;
}