首页 > 其他分享 >前缀和数组 差分数组

前缀和数组 差分数组

时间:2024-07-06 11:30:01浏览次数:8  
标签:数组 差分 查询 二维 一维 前缀

前缀和

一维:通过空间换时间适用于需要频繁查询某一段区间和的场景。

一维数组:a_{1}a_{2}a_{3}...a_{n}

一维前缀和中的每一项:

c_{i}=\sum_{1}^{i}a_{i},该前缀和中的每一项也就是数组中对应的前 i 项和。

一维前缀和数组的构造:

在输入原数组时同步构造前缀和数组c_{i}=\sum_{1}^{i}a_{i}可以改写为c_{i}=c_{i-1}+a_{i}   

for(int i=1;i<=n;i++){
    scanf("%d",&arr[i]);
    crr[i]=crr[i-1]+arr[i];
  }

通常前缀和数组从下标为1开始c_{0}的值默认为0

一维区间和查询:

查询原数组区间为 [ l , r ] 的元素的和:c_{r}- c_{l-1}

二维:通过空间换时间适用于需要频繁查询某一个子矩阵中元素和的场景。

二维数组:

b_{00} b_{01} b_{02}b_{03}. ..b_{0m}

b_{10}b_{11}b_{12}b_{13}...b_{1m}

b_{20}b_{21}b_{22}b_{23}...b_{2m}

. . . . . . . . . . . . . . . 

b_{n0}b_{n1}b_{n2}b_{n3}...b_{nm}

二维前缀和中的每一项:

c_{xy}=\sum_{1}^{x}\sum_{1}^{y}c_{ij},该前缀和中的每一项也就是数组中以b_{11}b_{xy}这两个元素为对角线构成的矩形中元素和。

二维前缀和数组的构造:

也是在输入原数组时同步构造前缀和数组c_{xy}=\sum_{1}^{x}\sum_{1}^{y}c_{ij} 根据二维数组一行一行地读入顺序可以改写为c_{xy}=c_{(x-1)y}+\sum_{1}^{m}b_{xi}   ,运用这种类似于dp的想法就可以实现。

for(int i=1;i<=n;i++){
    int sum=0;
    for(int j=1;j<=m;j++){
      scanf("%d",drr[i][j]);
      sum+=drr[i][j];
      crr[i][j]=crr[i-1][j]+sum;
    }
  }

和一维类似:行和列的都从1开始

二维子矩阵元素和查询:

查询以b_{x_{1}y_{1}}b_{x_{2}y_{2}}为对角线构成的子矩阵中元素和:c_{x_{2}y_{2}}-c_{(x_{1}-1)y_{2}}-c_{x_{2}(y_{1}-1)}+c_{(x_{1}-1)(y_{1}-1)}

差分

一维:通过空间换时间适用于需要频繁进行区间数值的批量增减操作的场景。

一维数组:a_{1}a_{2}a_{3}...a_{n}

一维差分数组中的每一项:

d_{i}=a_{i}-a_{i-1}

一维差分数组的构造:

边输入原数组边构造

for(int i=1;i<=n;i++){
    scanf("%d",arr+i);
    diff[i]=arr[i]-arr[i-1];
  }

一维差分数组与原数组的推导关系: 由差分数组定义移项可得:a_{i}=d_{i}+a_{i-1}

一维差分数组实现区间批量增减:

让区间 [ l , r ] 上的元素加x:让d_{l} 加上x,让d_{r+1} 减去x 

这种区间批量增减操作是静态的无法一遍查询一边修改,需要统一在差分数组上修改完毕后再通过差分数组与原数组的关系还原回原数组,再实现查询。

二维:等待补充。。。。

标签:数组,差分,查询,二维,一维,前缀
From: https://blog.csdn.net/zaqjkl/article/details/140217649

相关文章

  • 第18节 指针与数组
    文章目录第18节指针与数组1.一维数组与指针2.指针与字符串第18节指针与数组1.一维数组与指针►C++程序员更偏爱使用指针来访问数组元素,这样做的好处是运行效率高、写法简洁。►1.一维数组的地址 ►数组由若干个元素组成,每个元素都有相应的地址,通过......
  • C-数组地址移动
    #include<stdio.h>intmain(){inta[6]={1,2,3,4,5,6};printf("a的地址%p\n",a);//a代表a[0]的地址也是a的首地址printf("a[0]的地址%p\n",&a[0]);//a[0]的地址return0;}在一维数组中a和a[0]的地址相同,a和&a[0]的都代表a[0]的地址,&a代表整个数组a......
  • 数组练习题(一)
    1.   (销售人员薪金范围)解决以下问题。一家公司以底薪加提成的方式付给销售人员工资。销售人员每周获得200美元的底薪,外加本周达到一定销售额的9%的提成。例如,一个销售人员一周的销售额是5000美元,就会得到200美元加上5000美元的9%,即总共650美元。请编写一个程序(利用一......
  • 深入理解数组及其操作
    前言数组(Array)是一种线性数据结构,用于存储相同类型的元素。它在编程中广泛使用,因其简单性和高效的随机访问特性而受欢迎。本文将详细介绍数组的概念、基本操作及其在C语言中的实现。数组的基本概念数组是一组有序的元素集合,每个元素通过数组名和一个索引进行访问。数组的索......
  • 语法基础——字符、字符串与字符数组
    字符、字符串和字符数组2024-07-0520:52:00星期五字符串和字符数组的区别和联系字符串和字符数组在C语言中是紧密相关的概念,但它们之间存在一些区别和联系。定义与表示:字符串在C语言中并没有专门的类型,而是通过字符数组来表示。字符数组可以用来存储一个字符串,其中字......
  • 【力扣】每日一题—第88题,合并两个有序数组
    目录题目暴力求解思路:通过代码:拓展学习:最终代码如下:题目给你两个按**非递减顺序**排列的整数数组`nums1`和`nums2`,另有两个整数`m`和`n`,分别表示`nums1`和`nums2`中的元素数目。请你**合并**`nums2`到`nums1`中,使合并后的数组同样按**非递减顺序*......
  • 可视化二维函数的拉普拉斯算子 - 使用有限差分法来近似计算二维标量函数的拉普拉斯算
    可视化二维函数的拉普拉斯算子-使用有限差分法来近似计算二维标量函数的拉普拉斯算子flyfish算子(Operator)是指的是一个将函数、向量或其他对象映射到另一对象的数学实体。简单来说,算子就是一种“操作”或“变换”,它把一个输入(通常是函数或向量)变换成另一个输出。算子可......
  • C++基础知识持续更新,今天来记录结构体的基本知识,包括结构体的定义和使用,结构体数组,结
    C++结构体C++基础知识持续更新,今天来记录结构体的基本知识,包括结构体的定义和使用,结构体数组,结构体指针,结构体嵌套结构体,结构体做函数参数,结构体中的const的使用场景,以及结构体的案例。1.结构体的定义和使用结构体属于用户自定义的数据类型,允许用户存储不同的数据类型。......
  • 搜索旋转数组
    题目链接搜索旋转数组题目描述注意点数组已被旋转过很多次数组元素原先是按升序排列的若有多个相同元素,返回索引值最小的一个解答思路首先需要知道的是,本题数组中的旋转多次只是将头部的某些元素移动到尾部,所以不论怎么旋转,数组都是有一定顺序的,最差的情况是分为两......
  • 算法:递归数组求和
    递归数组求和给定一个数组,求所有元素的和算法思想:传入数组和下标,如果下标越界就返回0,否则返回当前值和下一个值的和,递归操作。Java实现:publicclassMain{ publicstaticintfunc(int[]array,intindex){ if(index>array.length-1){ return0; }el......