关于差分

所谓差分就是就是去维护一个数列的差值数组
打个比方就是
原数列位:
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)查询
如果是边修改变查询就要弃疗了,安心线段树吧

以上就是一维的差分
那么我们怎么去做到二维呢?
这里写图片描述
就这样。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值