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; const int N = 200010; int n, m; int a[N], s[N]; int main() { cin >> n >> m; for (int i = 1; i <= n; ++i) { cin >> a[i]; s[i] = s[i - 1] + a[i]; } while (m--) { int l, r; cin >> l >> r; cout << s[r] - s[l - 1] << endl; } return 0; } 
信息
- ID
 - 64
 - 时间
 - 1000ms
 - 内存
 - 256MiB
 - 难度
 - 7
 - 标签
 - 递交数
 - 22
 - 已通过
 - 7
 - 上传者