1 条题解
-
1
对于求数组 中某一个区间 的和,我们很容易可以想到,
for(int i = L;i <= R; ++i ) sum += a[i];
但是这样写时间复杂度为 ,如果题目还要求 次查询,时间复杂度就来到了 , 对于 的数据,很明显 会超时, ( 多嘴一句, 秒钟不要超过 ),那么我们考虑去优化他;
这里我们会用到类似高中学过的数列知识,我们需要构造一个新数组 , 所表示的是数组 前 项的和,便于理解,我使用下面几个等式当作例子;
这样我们在求某一个区间 的和时,就不必费时 去跑一边
for(int i = L;i <= R; ++i ) sum += a[i];
,可以直接用构造好的 数组直接 便可在 的时间快速计算出数组 区间和;这里有两点需要特别注意
- 是减去 不是 , 因为区间 包含第 项;
- 还有构建数组 时, 数组下标要从 开始,这避免了求 导致的数组下标越界问题,具体看下面代码实现;
参考答案:
#include<iostream> using namespace std; typedef long long LL; const int N = 100010; LL a[N], s[N]; LL n, m; int main() { cin >> n >> m; for (int i = 1; i <= n; ++i) { scanf("%lld", &a[i]); s[i] += s[i - 1] + a[i]; } while (m--) { int l, r; scanf("%d%d", &l, &r); printf("%lld\n", s[r] - s[l - 1]); } return 0; }
- 1
信息
- ID
- 5392
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 1
- 标签
- 递交数
- 13
- 已通过
- 6
- 上传者