1 条题解
-
0
文字教学
这道题数据量大,直接每次遍历区间求和会超时,用前缀和数组可以高效解决:
- 定义前缀和数组
s,其中s[i]表示数列前i个数的和(s[0]=0)。 - 预处理:遍历数列,计算
s[i] = s[i-1] + a[i]。 - 查询区间
[l,r]的和:直接用s[r] - s[l-1]得到结果。 这样预处理是O(n),每次查询是O(1),能轻松处理1e5的数据。
代码
#include <bits/stdc++.h> using namespace std; int a[100005], s[100005], n, m, l, r; int main() { ios::sync_with_stdio(false); cin.tie(0); cin >> n; for (int i = 1; i <= n; ++i) { cin >> a[i]; s[i] = s[i-1] + a[i]; } cin >> m; while (m--) { cin >> l >> r; cout << s[r] - s[l-1] << '\n'; } return 0; } - 定义前缀和数组
- 1
信息
- ID
- 6837
- 时间
- 1000ms
- 内存
- 128MiB
- 难度
- 3
- 标签
- 递交数
- 14
- 已通过
- 8
- 上传者
京公网安备 11011102002149号