P8218 【深进1.例1】求区间和

文章讲述了在大数据量下,如何通过使用前缀和技巧将区间和查询的问题从O(n*n)的时间复杂度降低到O(n),并给出了计算前缀和的具体方法以及求解区间和的代码示例。
摘要由CSDN通过智能技术生成

📌题目大意📌

给你 n 个数,和q次询问,让你输出从x到y的区间和

新知识🤔

📖如果使用先前的双重循环的方法,就是O(n*n)的时间复杂度,题目中给出的n≤1e5,数据量很大,所以会 T。那么就要用到前缀和的方法了

📖前缀和就是这个数及以前所有数的和!!!

🤔那为什么要用到前缀和呢

📌前缀和讲解📌

这就是前缀和数组怎么求!

可是,有人就说了拿着不好求吗,直接双重循环

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;
}

记得点赞关注哦,球球了😭😭😭😭

  • 4
    点赞
  • 8
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值