1.题目
2.算法思路
如果暴力求解的话,时间复杂度为O(n*q)。一定会超时。
优化的思路也很简单,就是得到一个求和数组arr,使arr[i]=a1+a2+...+ai。
然后每次求l到r之间的数时,直接arr[r]-arr[l-1]就可以得出!
这样,时间复杂度就降为O(n)+O(q)。
3.代码
#include <iostream>
using namespace std;
#include<vector>
int main() {
int n,q,l,r;
cin>>n>>q;
vector<long long int> arr(n+1);
vector<long long int> dp(n+1);
for(int i=1;i<n+1;i++){
cin>>arr[i];
}
for(int i=1;i<n+1;i++){
dp[i]=dp[i-1]+arr[i];
}
while(q--){
cin>>l>>r;
cout<<(dp[r]-dp[l-1])<<endl;
}
return 0;
}