首页 > 其他分享 >【学习】前缀和与差分

【学习】前缀和与差分

时间:2023-10-24 17:02:47浏览次数:25  
标签:前缀 r2 sum 差分 学习 leq 数组

前缀和与差分是 OI 中十分重要且常见的基本算法。

前缀和

前缀和是一个数组的基础信息。

一维前缀和的定义为:

\[s_n=\displaystyle \sum_{1\leq i \leq n - 1} a_{i} \]

可以通过递推求出:s[i] = s[i - 1] + a[i];

求出前缀和数组后,可以在 \(O(1)\) 时间内询问 \(a_l-a_r\) 之和。sum = s[r] - s[l - 1];

不难类推出二维前缀和:

$ s_{n,m} = \displaystyle \sum_{1\leq i \leq n - 1} \sum_{1\leq j \leq m - 1} a_{i,j}$

求出前缀和数组后,可以在 \(O(1)\) 时间内询问 \(a_{l1,r1}-a_{l2,r2}\) 之和。此处运用了容斥的思想。

sum = s[l2][r2] - s[l2][r1 - 1] - s[l1 - 1][r2] + s[l1 - 1][r1 - 1];
差分

通俗来说,差分是前缀和的逆运算

定义一维差分数组为:

\[d_1 = a_1, d_i = a_i - a_{i - 1} \]

这样,可以在 \(O(1)\) 时间内修改区间,而在 \(O(n)\) 时间内查询单点:

使 \(l-r\) 区间每一个数加上 \(1\):

d[r + 1]--, d[l]++;

对差分数组使用前缀和查询。

标签:前缀,r2,sum,差分,学习,leq,数组
From: https://www.cnblogs.com/sunruize/p/prefix-sum.html

相关文章

  • Excel XLL 学习
    Excel4V回调表格属性方法 事件 QQ774115495XLL文件 ......
  • 一站式学习C编程 Linux C编程一站式学习 pdf电子版
    一站式学习C编程LinuxC编程一站式学习pdf电子版作者:宋劲杉出版年:2011-3ISBN:9787121129827连接提取码:gcqb......
  • 《动手学深度学习 Pytorch版》 10.2 注意力汇聚:Nadaraya-Watson 核回归
    importtorchfromtorchimportnnfromd2limporttorchasd2l1964年提出的Nadaraya-Watson核回归模型是一个简单但完整的例子,可以用于演示具有注意力机制的机器学习。10.2.1生成数据集根据下面的非线性函数生成一个人工数据集,其中噪声项\(\epsilon\)服从均值为0,......
  • C++算法:前缀和、前缀乘积、前缀异或的原理、源码及测试用例
    相关源码测试用例下载包括4个压缩包,初始代码,实现前缀和,实现前缀积,实现前缀异或。都是在前者的基础上修改的。原理长度为n的数组nums,共有n+1个以nums[0]开始的子数组。索引范围分别为[0,i),i取值区间[0,n]。preSum[i]记录子数组[0,i)的和。比如:nums={1,2,3,4},则preSum={0,1,3,6......
  • C++前缀和算法应用:和至少为 K 的最短子数组的原理、源码及测试用例
    题目给你一个整数数组nums和一个整数k,找出nums中和至少为k的最短非空子数组,并返回该子数组的长度。如果不存在这样的子数组,返回-1。子数组是数组中连续的一部分。示例1:输入:nums=[1],k=1输出:1示例2:输入:nums=[1,2],k=4输出:-1示例3:输入:nums=......
  • C++前缀和算法:构造乘积矩阵
    题目给你一个下标从0开始、大小为n*m的二维整数矩阵grid,定义一个下标从0开始、大小为n*m的的二维矩阵p。如果满足以下条件,则称p为grid的乘积矩阵:对于每个元素p[i][j],它的值等于除了grid[i][j]外所有元素的乘积。乘积对12345取余数。返回grid的乘积......
  • C++算法前缀和的应用:得分最高的最小轮调的原理、源码及测试用例
    题目给你一个数组nums,我们可以将它按一个非负整数k进行轮调,这样可以使数组变为[nums[k],nums[k+1],…nums[nums.length-1],nums[0],nums[1],…,nums[k-1]]的形式。此后,任何值小于或等于其索引的项都可以记作一分。例如,数组为nums=[2,4,1,3,0],我们按k=2进行......
  • C++算法前缀和的应用:分割数组的最大值的原理、源码及测试用例
    分割数组的最大值二分过些天整理基础知识题目给定一个非负整数数组nums和一个整数m,你需要将这个数组分成m个非空的连续子数组。设计一个算法使得这m个子数组各自和的最大值最小。示例1:输入:nums=[7,2,5,10,8],m=2输出:18解释:一共有四种方法将nums分割为2个......
  • C++前缀和算法应用:矩形区域不超过 K 的最大数值和
    题目给你一个mxn的矩阵matrix和一个整数k,找出并返回矩阵内部矩形区域的不超过k的最大数值和。题目数据保证总会存在一个数值和不超过k的矩形区域。示例1:输入:matrix=[[1,0,1],[0,-2,3]],k=2输出:2解释:蓝色边框圈出来的矩形区域[[0,1],[-2,3]]的数值和是......
  • Liunx学习教程和常用命令
    Linux零基础快速入门到精通https://www.ixigua.com/7162034708828815879?series_flow=1&logTag=eed683fa846221955e83菜鸟教程https://www.runoob.com/linux/Linux-intro.html......