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;
}