解法一:暴力解法
根据题意,直接进行模拟,每次询问从 l 到 r 进行遍历求和。时间复杂度:O(n * q),会超时
解法二:前缀和
两步走:
第一步:预处理一个前缀和数组
用dp[i]表示从0位置到i位置的元素的和,则遍历数组一次,可以得到一个前缀和数组,前缀和数组中保存了dp[i]的每个数据。
在输入nums和预处理前缀和数组时,要注意边界情况,给nums和dp数组多开一个空间。
第二步:使用前缀和数组
有了前缀和数组之后,就可以以O(1)时间拿到 l 到 r 的元素和:
C++代码
#include <iostream>
#include <vector>
using namespace std;
typedef long long ll;
int main()
{
int n = 0, q = 0;
cin >> n >> q;
vector<int> nums(n + 1);
for(int i = 1; i < n + 1; ++i) {
cin >> nums[i];
}
vector<ll> dp(n + 1);
for(int i = 1; i < n + 1; ++i) {
dp[i] = dp[i - 1] + nums[i];
}
int l = 0, r = 0;
while(q--)
{
cin >> l >> r;
cout << dp[r] - dp[l - 1] << endl;
}
return 0;
}

京公网安备 11010502036488号