Poj 树状数组

来源:互联网 发布:数据产品经理书籍推荐 编辑:程序博客网 时间:2024/04/26 23:28

树状数组查询和修改复杂度都为log(n),假设数组a[1..n],那么查询a[1]+...+a[n]的时间是log(n),而且是一个在线的数据结构,

随时修改某个元素的值,复杂度也为log(n)。

 

 

C1 = A1

C2 = A1 + A2

C3 = A3

C4 = A1 + A2 + A3 + A4

C5 = A5

C6 = A5 + A6

C7 = A7

C8 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8

...

C16 = A1 + A2 + A3 + A4 + A5 + A6 + A7 + A8 + A9 + A10 + A11 + A12 + A13 + A14 + A15 + A16

 

Ci是其后2^k个数字的和,k= i & ( -i ),是将 i 写成二进制后末尾零的个数。

 

 

做了一些题总结树状数组有这么几种应用。

 

1.修改一个区域,查询一个点。

 

2.修改一个点,查询一个区域。

 

3.修改一个区域,查询一个区域。

 

 

 

poj 2352

一维树状数组,计算一个点左下的点有多少个。y是升序的。

 

 

 

poj3321

一维树状数组,此题树状数组倒是好写,关键是怎么用树状数组解。

我的做法是先深搜一次,重新给每个节点编号,利用节点新的编号来做树状数组。

 

 

 

poj 1656

二维树状数组,修改一个区域,查询一个区域

由于格子很小,只有100*100,所以修改的时候就直接两个for循环,查询的时候利用了它和的性质。

 

 

 

poj 1195

二维树状数组,修改一个点的值,查询一个区域的和。

修改点[x1,y1],查询时利用容斥原理则可得ans=(Sum(x2+1,y2+1)+Sum(x1,y1)-Sum(x2+1,y1)-Sum(x1,y2+1))).

 

 

 

poj 2155

二维树状数组,修改一个区域的值,查询一个点的值。

修改区域[x1,y1]到[x2,y2],根据树状数组将[x1,y1]增加1,则以其为顶点的右下的所有值都增加了1

利用容斥原理,将[x1,y2+1],[x2+1,y1]再翻转一次,[x2+1,y2+1]翻转一次即可。

查询的时候只需要查询[x1,y1]这个点。

 

 

 

hdoj 3584

三维树状数组,修改一个长方体空间的状态,查询空间中某点的状态,和二维的相同,利用三阶的容斥原理。

 

 

 

代码贴到后面的文章吧

原创粉丝点击