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。

相关推荐
_OP_CHEN1 分钟前
【算法基础篇】(四十三)数论之费马小定理深度解析:从同余性质到乘法逆元
c++·算法·蓝桥杯·数论·acm/icpc
老朋友此林2 分钟前
React Hook原理速通笔记1(useEffect 原理、使用踩坑、渲染周期、依赖项)
javascript·笔记·react.js
水月wwww5 分钟前
【算法设计】分支限界法
算法·分支限界法
茶猫_11 分钟前
C++学习记录-旧题新做-链表求和
数据结构·c++·学习·算法·leetcode·链表
yuniko-n17 分钟前
【牛客面试 TOP 101】链表篇(一)
数据结构·算法·链表·面试·职场和发展
2501_9418053125 分钟前
从微服务网关到统一安全治理的互联网工程语法实践与多语言探索
前端·python·算法
源代码•宸26 分钟前
Leetcode—1161. 最大层内元素和【中等】
经验分享·算法·leetcode·golang
Chris_121929 分钟前
Halcon学习笔记-Day5
人工智能·笔记·python·学习·机器学习·halcon
日更嵌入式的打工仔40 分钟前
Ehercat代码解析中文摘录<7>
笔记·ethercat
CodeByV1 小时前
【算法题】模拟
算法