所谓差分就是就是去维护一个数列的差值数组
打个比方就是
原数列位:
1,2,3,4,5,6,7
那么我们要维护的差分数列就是
1,1,1,1,1,1,
就是对于第i个数
那么差分数列的第i+1位就是data[i]-data[i-1]
这个东西有什么用呢?
void getarr()
{
for(int i=1;i<=n;i++)
{
data[i]=data[i-1]+div[i];//div为差分数组
}
}
我们可以按照这样的方式把数组还原回去;
这样就支持一些奇怪的操作了
如果我们要更改一个区间的值就比如说区间l,r吧
如果我们更改了差分数组的第i位,那么我们还原的时候,就会影响到i位及以后的元素,这样的话
我们如果要在l,r上加一,那么我们就这样
div[l]+=1;div[r+1]+=-1;
对于这样的区间操作。
我们就可以O(1)修改
并且最后O(n)查询
如果是边修改变查询就要弃疗了,安心线段树吧
以上就是一维的差分
那么我们怎么去做到二维呢?
就这样。