解法一:暴力解法
根据题意,直接进行模拟,每次询问从 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; }