前置芝士
引入
先看例题:(洛谷 P3368 【模板】树状数组 2)
已知一个数列,你需要进行下面两种操作:
1.将某区间每一个数数加上 x x x
2.求出某一个数的值。
这题和 树状数组1 有什么区别?
没错,正如题目所说,这题是区间修改和单点查询!
区间修改和单点查询
区间修改和单点查询要怎么实现呢?这需要用到一个东西:差分。
差分是什么呢?(知道的大佬可以跳过)
对于一个数组 a [ ] a[] a[],我们设它的差分数组为 b [ ] b[] b[],则满足:
b [ 1 ] = a [ 1 ] b[1]=a[1] b[1]=a[1]
b [ i ] = a [ i ] − a [ i − 1 ] ( 1 < i ≤ n ) b[i]=a[i]-a[i-1](1<i≤n) b[i]=a[i]−a[i−1](1<i≤n)
那这有什么用呢?我们可以发现一个性质:
a [ i ] = ∑ k = 1 n b k a[i]=\sum\limits_{k=1}^n b_k a[i]=k=1∑nb