📌题目大意📌
给你 n 个数,和q次询问,让你输出从x到y的区间和
新知识🤔
📖如果使用先前的双重循环的方法,就是O(n*n)的时间复杂度,题目中给出的n≤1e5,数据量很大,所以会 T。那么就要用到前缀和的方法了
📖前缀和就是这个数及以前所有数的和!!!
🤔那为什么要用到前缀和呢
📌前缀和讲解📌![](https://img-blog.csdnimg.cn/direct/5f2fefb3782349918dd9b18bc59bb00f.png)
这就是前缀和数组怎么求!
可是,有人就说了拿着不好求吗,直接双重循环
for(int i = 1; i <= n; i ++)
{
for(int j = 1; j <= i; j ++)
{
sum[i] += a[j];
}
}
额😒😒😒,这不还是O(n*n)吗
所以我们就要找到一个新的求法
既然sum[i - 1]是前i - 1个数的前缀和,那加上a[i]不就是前i个数的前缀和了吗?
如果还不懂的话,那就再看看我下面的详解
数组a 1,2,3,4,5,6
🤔第一个数的前缀和:1
🤔第二个数的前缀和:1 + 2 = 3
🤔第三个数的前缀和:1 + 2 + 3 = 6
🤔第四个数的前缀和:1 + 2 + 3 + 4 = 10
.
.
.
🤔第六个数的前缀和:1 + 2 + 3 + 4 + 5 + 6 = 21
📖所有绿色的数是前i - 1个数的前缀和,而红色的数是a[i]
所以正确的求法是
sum[i] = sum[i - 1] + a[i];
前缀和求好了,那怎样求区间和呢?
于是乎,我们就能写代码了!
#include<bits/stdc++.h>
using namespace std;
const int N = 100000 + 10;
int a[N],sum[N];
int main()
{
int n;
cin >> n;
for(int i = 1; i <= n; i ++) // 输入
cin >> a[i];
for(int i = 1; i <= n; i ++) // 求前缀和
sum[i] = sum[i - 1] + a[i];
int q;
cin >> q;
for(int i = 1; i <= q; i ++) // q组询问
{
int x,y;
cin >> x >> y;
cout << sum[y] - sum[x - 1] << endl; // 求区间和
}
return 0;
}
记得点赞关注哦,球球了😭😭😭😭