C/C++ 前缀和与差分

这篇具有很好参考价值的文章主要介绍了C/C++ 前缀和与差分。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

个人主页:仍有未知等待探索_C语言疑难,数据结构,算法-CSDN博客

专题分栏:算法_仍有未知等待探索的博客-CSDN博客

目录

一、前言

1、什么是前缀和

2、什么是差分

3、优势

1.朴素做法:

2.用差分数组

二、代码实现

1、给一个数组去求其差分数组

2、给一个数组去求其前缀和数组


一、前言

1、什么是前缀和

前缀和是一种预处理,用于降低查询时的时间复杂度。其就像是数学中的前n项和。

给定 n个整数,然后进行 m 次询问,每次询问求一个区间内值的和。

如果用暴力写法,那每次询问都需要从区间左端点循环到区间右端点求和,时间复杂度较大。

这种时候就可以预先求出该数组的一维前缀和。

比如说数组【1,1,1,1,1】,则前缀和数组就是【1,2,3,4,5】。

2、什么是差分

差分更像是前缀和数组的原数组。

比如说前缀和数组是【1,2,3,4,5】,则差分数组就是【1,1,1,1,1】。

总结一句话:前缀和和差分是互逆运算。

3、优势

如果让你把数组的一个子区间全都加上一个数 c,并且去对改区间进行求和。

1.朴素做法:

  • 找到该区间,然后对每个数进行相加 c
  • 在遍历一遍进行求和

如果要加数的区间多,求和的区间多的话,时间太长。

2.用差分数组

  • 找到要加数的区间左端点,然后仅对左端点进行加 c 操作(在左端点的右侧,其前缀和数组均加上了 c)
  • 但是我们想加数的范围仅在某一个区间,这样的话我们就对其右端点+1进行-c操作,这样就行了

二、代码实现

注意:数组一定要从1开始进行存储,要不然求前缀和数组的时候还要特判。

1、给一个数组去求其差分数组

#include<iostream>
using namespace std;

const int N = 1e5 + 5;
int a[N];//原数组
int b[N];//差分数组
int n;//数的个数

//可以将求一个差分数组,分成求1个元素的差分数组
void insert (int c,int i)
{
	b[i] += c;
	b[i + 1] -= c;
}
int main()
{
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];

	for (int i = 1; i <= n; i++) insert(a[i], i);

	for (int i = 1; i <= n; i++) cout << b[i] << " ";
	return 0;
}

2、给一个数组去求其前缀和数组

#include<iostream>
using namespace std;

const int N = 1e5 + 5;
int n;//数的个数
int a[N];//原数组
int s[N];//前缀和数组

int main() {
	cin >> n;
	for (int i = 1; i <= n; i++) cin >> a[i];

	for (int i = 1; i <= n; i++) {
		s[i] = s[i - 1] + a[i];//每一个前缀和数组元素一定是它前一个前缀和数组元素加上自己的元素
	}

	for (int i = 1; i <= n; i++) {
		cout << s[i] << " ";
	}
	return 0;
}

谢谢大家的支持!文章来源地址https://www.toymoban.com/news/detail-768542.html

到了这里,关于C/C++ 前缀和与差分的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 【OI学习笔记】基础算法-前缀和与差分算法

    板块:基础算法、线性优化 难度:较易 前置知识:C++基础语法 在一维空间中,对于一个数据总量为 n n n 的数组 a a a ,有数据 a [ 1 ] , a [ 2 ] , a [ 3 ] , . . . , a [ n − 1 ] , a [ n ] a[1],a[2],a[3],...,a[n-1],a[n] a [ 1 ] , a [ 2 ] , a [ 3 ] , ... , a [ n − 1 ] , a [ n ] ,定义一个数组 s u m sum s u m ,

    2024年02月08日
    浏览(32)
  • 【有营养的算法笔记】基础算法 —— 推导证明前缀和与差分

    👑作者主页:@安 度 因 🏠学习社区:StackFrame 📖专栏链接:有营养的算法笔记 如果无聊的话,就来逛逛 我的博客栈 吧! 🌹 Hello,小伙伴们,好几天没有更新了,今天更了一篇比较“硬核的文章”。 主要内容为前缀和与差分算法的推导证明和代码实现。这篇文章博主还是画

    2024年01月21日
    浏览(37)
  • 二维前缀和&二维差分(超详细,python版,其他语言也很轻松能看懂)

    上一篇文章讲解了一维前缀和一维差分,本篇进阶为二维。 二维前缀和跟一维前缀和求法相同,这里直接上例子。 数组a = [[1,2,2,1],[3,2,2,1],[1,1,1,1]] a数组如图: 则数组a的前缀和为:数组b[[1,3,5,6],[4,8,12,14],[5,10,15,18]] b数组如图: 前缀和递推公式为 b[i][j] = b[i - 1][j] + b[i][j - 1]

    2024年04月22日
    浏览(27)
  • C++ 二维差分 二维前缀和逆运算 差分矩阵

    输入一个 n 行 m 列的整数矩阵,再输入 q 个操作,每个操作包含五个整数 x1,y1,x2,y2,c ,其中 (x1,y1) 和 (x2,y2) 表示一个子矩阵的左上角坐标和右下角坐标。 每个操作都要将选中的子矩阵中的每个元素的值加上 c 。 请你将进行完所有操作后的矩阵输出。 输入格式 第一行包含整数

    2024年02月21日
    浏览(42)
  • 高精度/前缀和/差分

    存储方式: 整数的长度一般小于1e6 大整数的每一位存储到数组里 存储时低位在前,高位在后,方便进位 高精度加法 每一位相加Ai + Bi + t, t表示进位取值0/1,逢十进一 模板: 高精度减法 每一位相减Ai - Bi - t, t 表示借位取值0/1 模板: 高精度乘法 A * b ,b=10000, len(A) = 1e6 , 乘的

    2024年02月16日
    浏览(30)
  • 前缀和&差分

    前缀和:一段序列里的前n项和 给出n个数,在给出q次问询,每次问询给出L、R,快速求出每组数组中一段L至R区间的和 给出一段数组,每次问询为求出l到r区间的和 普通方法: L到R进行遍历,那么在每次求区间和的过程中时间复杂度为O(n),q次问询时间复杂度为O(q*n) 前缀和:

    2024年02月15日
    浏览(25)
  • 前缀和 差分

    对于数列A,它的前缀和数列S[i]就表示数列A从第一个元素到第i个元素的总和。 前缀和的主要用处:求任意区间的区间和 一般通过遍历求和的时间复杂度是O(n),通过前缀和可以减少为O(1) 具体解法如下: ​前缀和计算区间[l,r]的区间和:S[r] - S[l - 1] ACWing 795前缀和 Tips: ​让元素

    2024年02月05日
    浏览(41)
  • 前缀和、差分

    前缀和可以快速求区间和。 差分相当于前缀和的逆运算。 前缀和、差分都是以空间换时间的算法 注意:本文图文并茂 将提供以下图文链接供大家理解: 图文链接: 飞书图解链接🎉🎉🎉 密码: 672Z172 定义 前缀和可以简单理解为「数列的前 n 项的和」,是一种重要的预处

    2024年02月05日
    浏览(34)
  • 算法基础之差分和前缀和

    结论:差分是前缀和的逆运算 举例 一维差分 二维差分 用在一维子区间里的数都增减一个固定值,把对于区间内每个数的操作转换为对于差分数组中的端点的操作,时间复杂度降为o(1)。 用在二维子矩阵里的数都增减一个固定值,把对于子矩阵的每个数的操作转换为对应差分

    2024年02月07日
    浏览(31)
  • 第四章:前缀和、差分(数列)

    在解释什么是前缀和之前,我们先回顾一下高中学过的数列: 我们这里所说的前缀和其实就是我们在高中学的数列中的 Sn(前n项和) ,只是我们这里需要将 S1 , S2 , S3 , S4 …… Sn 当作一个新的数组。 为了这个式子的高度统一性,我们的S0和a0都是不存储数据的,将其设置为0,这

    2023年04月08日
    浏览(22)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包