差分(深度理解)

以前一直以为差分就是so easy

按照前缀和直接定义差分数组为某一数列前后两项之差(请自行忽视二维

额,结果碰上二维是就打脸了

差分变得异常抽象

十分不好理解,

吼吼,我就直接说下自己的理解

首先,差分就是个专业术语,不要想着做差(其实就是做差,但不好写代码,且十分抽象)

我更乐意它被当成一个过程

应该没人看到这行小字吧。。

就是以一个自己定义的行为

求和它有着诸如区间加法区间减法这般的性质

试想一下,要是我们涉及多次查询,那就最好用到线段树或树状数组但不提

但它不需要多次查询,他只是一个不用多次查询的线段树罢了

我们可以让修改最快,查询适当慢上一点也无所谓了

优化修改的方法有哪些啊:

这时你肯定会大叫:懒标记(不会没学线段树吧)

不知道也不要紧,我们不需要知道懶标记这个东西,只要知道思想即可

思想:对于满足区间加减法的东西,我们什么时候更新,随便更换更新顺序,最后结果永远是一样的

容易发现我们更新时涉及许多重复操作,所以,我们可以先做个标记,意思是还没更新,到最后一次操作更新答案(区间加减法的特权)

标记就是做一件我们没打标记时做的事情,更新!!

这时在做差分就不难了

一维差分:懶标记就是一个ADD,在数组某处有ADD,意思是这个数包括后面的数还没更新,更新的值为ADD;

所以我们要把区间(x,y)加上一个值k,我们就可以让x处ADD+=k,y+1处ADD-=k;这样产生的结果是,最后去除标记时,(x,y)+=k,而y后面的被另外一个ADD抵消了

这样就实现了区间加,我们可以不另外开数组存ADD,反正是按顺序更新的,这是就变为了正常的没有ADD的代码(网上随便找)

二维差分:ADD可以是从这个位置开始的右下所有位置都加上ADD,这样可以组合为:矩形区间和。。。。。。(1)

       也可以是从这个位置开始的右下斜线都加上ADD, 这样可以组合为:三角形(配合(1))

     当然,我们可以任意定义ADD达到不同的效果,考试时自己想

当然,按照这个我们还可以自行搞出三维差分之类的东西

代码就不补了,谁都会的嘛(逃

没人看到这行小字吧。。。。

猜你喜欢

转载自www.cnblogs.com/zrqlj/p/11298861.html