前缀和与差分

前缀和与差分

文章目录

  • 前言
  • 一、前缀和与差分是什么?
  • 二、举例解释
    • 题目摘自黑龙江农垦科技职业学院喜迎寒假多校联赛2(快乐ak场)的C题
  • 总结


前言

大家好本蒟蒻又回来啦,前缀和与差分本是很早很早以前就学过的知识点,但由于本蒟蒻平时训练爱偷懒没怎么做这类题目,能用几个循环往上嵌套就绝不用前缀和差分来运算~~(好吧其实当时并不太会,毕竟暴力算法至上,以至于在昨天的比赛中连续三次被报运行超时,在学长的鄙视中才想起来还是前缀和好)~~

一、前缀和与差分是什么?

前缀和简单来说就相当于高中时候所学的数列的前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
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;
}

总结

其实一维前缀和并不难理解,小编想了好久也没有想到太多的代码注解,请大家见谅,关于二位前缀和的内容小蒟蒻后期会添加进来,还请大家多多包涵与支持,如果有不对的地方请及时纠正,谢谢大家

你可能感兴趣的:(C++)