树状数组是个好东东,我们一定要学会。
单点修改需,树状数组只需
。
区间查询需,树状数组只需
。
区间修改与查询,用它!用它!用它!!!
树状数组基本概念
树状数组的核心思想有关于二进制,不算特别难,而且代码贼短,适合作者这种小菜。
树状数组就是让需要改变的那个区间的第一个数加上改变的大小;让区间最后一个数的后一个数减去要改变的大小(类似差分)。第一个数加完后,使包含它的数也加上改变的大小;最后一个数的后一个数减完后,使包含它的数也减上改变的大小。
好,讲完这么多,你们肯定不理解,接下来我来解释(说了一堆废话)
树状数组单点修改
进入正题。
区间修改我们普通修改是不是需要,但是我们用树状数组只需要
,是不是很优呢?
当我们修改第一个数的时候,让他增加一个数n(我们假定n为2)。但在个时候,有一些本来包含这个数的大数就不服了:“我们包含他,他咋还比我们大了呢?”,所以说这个时候,为了平复民情啊,我们还需要把包含这个数的大数也加上2,附上一张图:
看,比如说我们要更改的是的话,那包含他的数是不是有:
。所以说我们需要让这些数也加上
。
这时候就会有同学问了:“怎么找到包含他的数呢?”
诶,问得好!
我也不知道。
啊开个玩笑,我怎么可能不知道呢?
前面我们说了树