树状数组

来源:互联网 发布:二级vb语言程序设计 编辑:程序博客网 时间:2024/09/21 06:32
三分钟学会树状数组系列

内容基本出自这里讲的很详细。。我只是自己整合了一遍- -。。ORZ神犇!

http://hi.baidu.com/wyl8899/item/c3ac1c0eec3516ea34990267

lowbit(x) = x & (-x)

树状数组只有两种操作:1、单点修改;2、求1~n的区间和

树状数组能够完成的操作线段树都能够做到,但是因为树状数组占用空间小+常数小所以如果可以的话树状数组还是一个蛮不错的选择- -

由这两个基本操作衍生出了一些别的操作。

(以下的修改都是加上一个数)

1、单点修改+任意区间查询。[l,r] = [1,r] - [1,l-1]。这个技巧下面每一个都会用到。

2、区间修改+单点查询。做法是把原序列弄成一次差分数列,然后单点查询就是求前缀和了。

3、区间修改+区间查询。首先把区间用1、的技巧拆开(这一步是必要的)做法还是弄成一次查分序列,按照单点查询的方法来查询一个区间(就是多个点的和)。。第 i 个数被加了(n-i+1)次,然后把 i*d[i] 做为一个新的量来维护。两个树状数组就可以完成操作。

模板题 Poj 3468

现在来考虑二维的

4、单点修改+区间查询。[x0,y0,x1,y1] = [1,1,x1,y1] - [1,1,x0-1,y1] - [1,1,x1,y0-1] + [1,1,x0-1,y0-1]。

5、区间修改+单点查询。把修改区间 [x0,y0,x1,y1] 变成修改点 + [x0,y0] - [x0,y1+1] - [x1+1,y0] + [x1+1,y1+1]。

6、区间修改+区间查询。把上面两个技巧一起用,把查询区间用4、的技巧拆开,归为四个左上角为[1,1]的区间。查一个区间就相当于查这个区间的所有单点,对每个这样的区间分别考虑区间内每个点被计算了多少次,展开式子用三个树状数组来维护就行。

模板题 Tyvj 1716

另外推荐两道挺不错的题(其实只是做了这么两道题- -。。)

CF 341D,和2D的区间修改区间做法很相似

Spoj 9137/9138,差分+线段树可过,不过很慢。。再差分就可以用树状数组了,维护三个值,分别是2次项、1次项和常数项
原创粉丝点击