Acwing-基础算法课笔记之基础算法(差分)

Acwing-基础算法课笔记之基础算法(差分)

一、一维差分

1、差分的概念

对于一个给定的序列a,它的差分序列b定义为:
b [ 1 ] = a [ 1 ] b[1]=a[1] b[1]=a[1], b [ i ] = a [ i ] − a [ i − 1 ] b[i]=a[i]-a[i-1] b[i]=a[i]−a[i−1], ( 2 ⩽ i ⩽ n ) (2\leqslant i\leqslant n) (2⩽i⩽n)

b是a的差分序列,a是b的前缀和序列,差分与前缀和是一对互逆运算
a [ 1 ] = b [ 1 ] a[1]=b[1] a[1]=b[1],
a [ 2 ] = b [ 2 ] + a [ 1 ] = b [ 2 ] + b [ 1 ] a[2]=b[2]+a[1]=b[2]+b[1] a[2]=b[2]+a[1]=b[2]+b[1],
a [ 3 ] = b [ 3 ] + a [ 2 ] = b [ 3 ] + b [ 2 ] + b [ 1 ] a[3]=b[3]+a[2]=b[3]+b[2]+b[1] a[3]=b[3]+a[2]=b[3]+b[2]+b[1],证毕

2、差分思想

把序列a的区间 [ l , r ] [l,r] [l,r]加d,等价于其差分序列b的点 b [ l ] b[l] b[l]加d,点 b [ r + 1 ] b[r+1] b[r+1]减d,其他位置不变。即把原序列的"区间操作 "转化为差分序列的"两点操作 "。多次区间操作完成后,再利用前缀和还原。时间复杂度从 O ( n 2 ) O(n^2) O(n2)降为 O ( n ) O(n) O(n)

二、二维差分

操作流程

(x1,y1) * * * *
* * * * *
* * * * *
* * * * (x2,y2)

① b [ x 1 , y 1 ] + = c b[x1,y1]+=c b[x1,y1]+=c:坐标 ( x 1 , y 1 ) (x1,y1) (x1,y1)右下区域的所有数加 c c c;

② b [ x 2 + 1 , y 1 ] − = c b[x2+1,y1]-=c b[x2+1,y1]−=c:坐标 ( x 2 + 1 , y 1 ) (x2+1,y1) (x2+1,y1)右下区域的所有数减 c c c;

③ b [ x 1 , y 2 + 1 ] − = c b[x1,y2+1]-=c b[x1,y2+1]−=c:坐标 ( x 1 , y 2 + 1 ) (x1,y2+1) (x1,y2+1)右下区域的所有数减 c c c;

④ b [ x 2 , y 2 ] + = c b[x2,y2]+=c b[x2,y2]+=c:坐标 ( x 2 , y 2 ) (x2,y2) (x2,y2)右下区域的所有数多减了 c c c,所以要全部加 c c c。

相关推荐
AI软著研究员4 小时前
程序员必看:软著不是“面子工程”,是代码的“法律保险”
算法
FunnySaltyFish4 小时前
什么?Compose 把 GapBuffer 换成了 LinkBuffer?
算法·kotlin·android jetpack
颜酱5 小时前
理解二叉树最近公共祖先(LCA):从基础到变种解析
javascript·后端·算法
地平线开发者21 小时前
SparseDrive 模型导出与性能优化实战
算法·自动驾驶
董董灿是个攻城狮21 小时前
大模型连载2:初步认识 tokenizer 的过程
算法
地平线开发者1 天前
地平线 VP 接口工程实践(一):hbVPRoiResize 接口功能、使用约束与典型问题总结
算法·自动驾驶
罗西的思考1 天前
AI Agent框架探秘:拆解 OpenHands(10)--- Runtime
人工智能·算法·机器学习
HXhlx1 天前
CART决策树基本原理
算法·机器学习
Wect1 天前
LeetCode 210. 课程表 II 题解:Kahn算法+DFS 双解法精讲
前端·算法·typescript
颜酱1 天前
单调队列:滑动窗口极值问题的最优解(通用模板版)
javascript·后端·算法