以前一直以为差分就是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达到不同的效果,考试时自己想
当然,按照这个我们还可以自行搞出三维差分之类的东西
代码就不补了,谁都会的嘛(逃
没人看到这行小字吧。。。。