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。

相关推荐
来自于狂人13 分钟前
当大模型训练遇上“双向飙车”:DeepSeek开源周 DualPipe解析指南
人工智能·算法·系统架构·gpu算力
栀子清茶25 分钟前
Towards Universal Soccer Video Understanding——论文学习(足球类)
论文阅读·人工智能·深度学习·学习·算法·计算机视觉·论文笔记
uhakadotcom30 分钟前
阿里云MaxFrame分布式计算框架:十倍性能提升的Python大数据利器
算法·面试·github
Unity粉末状在校生1 小时前
Unity知识总结——算法
算法·unity·排序算法
ak啊1 小时前
空间优化 Morris 遍历算法
算法
小羊在奋斗1 小时前
【算法】数组、链表、栈、队列、树
数据结构·算法
qq_589568101 小时前
java学习笔记2
java·笔记·学习
KyollBM1 小时前
数学——A. K-divisible Sum + D. Exam in MAC
c++·算法·macos
prettyxian2 小时前
【c++】继承
开发语言·c++·算法
旧厂街小江2 小时前
LeetCode第76题:最小覆盖子串
后端·算法·程序员