1、概念
前缀和
定义:
给定一个数组a[n],我们定义一个前缀和数组Prefix[n]
前缀和数组第n项表示数组a前n项的和。
即:
Prefix[1]=a[1]
Prefix[2]=a[1]+a[2]
Prefix[3]=a[1]+a[2]+a[3]以此类推
2、基本计算‘
因此我们可以由前缀和数组的快速生成 prefix[i]=prefix[i-1]+a[i]
求一段区间的和 sum(l,r)=prefix[r]-prefix[l-1]
注意:前缀和是一种预处理方法,只适用于数组为静态数组,其他情况下可以根据要求选择差分数组,树状数组,线段树等数据结构。
3、简单实现
#include"bits/stdc++.h"
using namespace std;
const int N = 1000;
int a[N],prefix[N];
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) prefix[i]=prefix[i-1]+a[i];
for(int i=1;i<=n;i++) cout<<prefix[i]<<' ';
int l,r;cin>>l>>r;
cout<<prefix[r]-prefix[l-1];
return 0;
}
4、一道简单的前缀和题目
其中题目中各数字的取值范围1≤n,m≤105,1≤a[i]≤100,1≤𝑙≤𝑟≤𝑛,1≤k≤5。
#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int N=1e5+9;
const ll p = 1e9+7;
ll a[6][N],prefix[6][N];//由题意可知k小于等于五,就用a数组的层数记录输入数字的该层数次方,再计算各层前缀和
//最后用sum(l,r)=prefix[r]-prefix[l-1]计算结果
int main()
{
ios::sync_with_stdio(0),cin.tie(0),cout.tie(0);//取消同步流
int n,m;cin>>n>>m;
for(int i=1;i<=n;++i)cin>>a[1][i];//输入·一次方数
for(int i=2;i<=5;++i){
for(int j=1;j<=n;++j) a[i][j]=a[i-1][j]*a[1][j]%p;//计算2~5次方数
}
for(int i=1;i<=5;++i)
for(int j=1;j<=n;++j)
prefix[i][j]=(prefix[i][j-1]+a[i][j])%p;//计算各层前缀和
while(m--)
{
int l,r,k;cin>>l>>r>>k;
cout<<(prefix[k][r]-prefix[k][l-1]+p)%p<<"\n";//输出要求 查询答案
}
return 0;
}