前缀和与差分
前言
大家好本蒟蒻又回来啦,前缀和与差分本是很早很早以前就学过的知识点,但由于本蒟蒻平时训练爱偷懒没怎么做这类题目,能用几个循环往上嵌套就绝不用前缀和差分来运算~~(好吧其实当时并不太会,毕竟暴力算法至上,以至于在昨天的比赛中连续三次被报运行超时,在学长的鄙视中才想起来还是前缀和好)~~一、前缀和与差分是什么?
前缀和简单来说就相当于高中时候所学的数列的前N项和,差分就是第i个数与前一个数的差值;
前缀和与差分是一对对称操作
前缀和公式:s[i]=s[i-1]+arr[i]
差分公式:arr[i]=s[i]-s[i-1]
二、举例解释
题目摘自黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)的C题
链接:https://ac.nowcoder.com/acm/contest/11471/C
来源:牛客网
题目描述
这一天gg拿到了一份,超多的考试数据a 。
老师要求他按照询问数据告诉老师,第几个到第几个同学的分数和是多少 ?
gg最近入职字节跳动了,没有时间处理这种极其简单的问题,所以请你顺手秒一下。
输入描述:
第一行n m ( n个同学 m次询问)
1<=n<=106
1<=m<=104
第二行输入n个整数表示成绩
a1 a2 …an (0<=ai<=100) 1<=i<=n
以下m行为两个整数bi bj 表示第几个到第几个同学(从1开始)
1<=bi<=bj<=n
输出描述:
m行查询结果
示例1
输入
复制
10 3
11 22 33 44 55 66 77 88 99 10
1 4
2 10
5 7
输出
复制
110
494
198
说明
注意第几个是按照输入顺序 不要排序 不要排序 不要排序
代码如下 :
#include<bits/stdc++.h>
using namespace std;
int n,m;
int arr[1000001],s[1000001];
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>arr[i];
for(int i=1;i<=n;i++)
s[i]=s[i-1]+arr[i];//前缀和
while(m--){
int a,b;
cin>>a>>b;
cout<<s[b]-s[a-1]<<endl;//进行差分
}
return 0;
}
总结
其实一维前缀和并不难理解,小编想了好久也没有想到太多的代码注解,请大家见谅,关于二位前缀和的内容小蒟蒻后期会添加进来,还请大家多多包涵与支持,如果有不对的地方请及时纠正,谢谢大家