一维前缀和

本文介绍了前缀和的概念,用于计算数组中指定区间和的高效方法,通过示例和C++代码展示了如何使用一维前缀和解决区间和问题,以及朴素算法的对比。
摘要由CSDN通过智能技术生成

在这里插入图片描述
acwing:模板题 https://www.acwing.com/problem/content/797/

一、前缀和是什么?
前缀和,通俗的说:对存有一些数字的某个数组而言,前缀就是指的其数组的前k项相加的值,因此对应的前缀和就是数组前k项的和。对一个数组,问[L,R]的区间和(从第L项到第R项的值相加的和),就可以利用前缀和进行求解。

二、一维前缀和讲解
一维前缀和大概就是:有一个由N个数字组成的数组arr[ ],对其进行q次的询问求[L,R]的区间和。

举例说明

数组arr[ ]是由1,3,7,5,2按顺序组成,对其进行3次询问分别是
[2,4],[0,3],[3,4]的区间和。

一般解法:
第一次询问: 区间和[2,4]=7+2+5=14;
第二次询问: 区间和[0,3]=1+3+7+5=16;
第三次询问: 区间和[3,4]=5+2=7;

应用:

//一维前缀和
#include <bits/stdc++.h>
using namespace std;

const int maxn = 11111;

int n,m,p[maxn];

int main()
{
	cin>>n>>m;
	
	for(int i=1;i<=n;i++) cin>>p[i];
	
	for(int i=1;i<=n;i++) p[i] = p[i-1]+p[i]; //预处理
	
	while(m--) //m次询问
	{
		int l,r; cin>>l>>r;
		
		cout<<p[r]-p[l-1]<<endl;
	}
	
	return 0;
}

朴素算法: //会超时~~~~~~~~~~~~~~~~~~~

#include <iostream>
using namespace std;

const int N = 111111;

int n,m,p[N];

int main()
{
	cin>>n>>m;
	
	for(int i=1;i<=n;i++) cin>>p[i];
	
	
	
	while(m--)
	{
		int l,r; cin>>l>>r;
		
		int sum = 0;
		
		for(int i=l;i<=r;i++)
		{
			sum+=p[i];
		}
		
		cout<<sum<<endl;
	}
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

像linux的企鹅

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值