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