博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

线段树和树状数组(BIT)

Posted on 2010-10-31 14:27  深处的心扉  阅读(459)  评论(0)    收藏  举报

线段树和树状数组的比较:

 线段树能够解决我们需要解决的问题,但是同时我们也知道线段树的缺点:空间上线段树需要至少10N的空间,而BIT只需要N的空间。线段树常数大,代码复杂,而BIT与之相反……

 但是BIT与线段树是不能划等号的,因为BIT研究的问题总是关于社区间[1..R]的,所以我们能够舍去许多不会涉及到的空间,才有了后面的诸多讨论和研究。基于这个原因,BIT能够取出的区间左端点是局限的,而与之相对应,线段树则能取出任意一段区间。

…………………………………………

因此,BIT是线段树的简化版本,在一些特殊的区间问题上有着重要的作用…………=_=

一段BIT的代码:

代码
1 {树状数组}
2  var a,c:array[0..200000]of longint;
3 i,m,n,x,y,z:longint;
4 function lowbit(x:longint):longint; //低位技术
5 begin
6 lowbit:=x and (-x);
7 end;
8 function get(x:longint):longint;
9 var s:longint;
10 begin
11 s:=0;
12 while x>0 do
13 begin
14 inc(s,c[x]);
15 dec(x,lowbit(x));
16 end;
17 exit(s);
18 end;
19 procedure add(x,t:longint);
20 begin
21 while x<=n do
22 begin
23 inc(c[x],t);
24 inc(x,lowbit(x));writeln(x);
25 end;
26 end;
27 begin
28 assign(input,'tree.in');
29 assign(output,'tree.out');
30 reset(input);rewrite(output);
31 readln(n);
32 for i:=1 to n do begin read(a[i]);add(i,a[i]); end;
33 readln(m);
34 for i:=1 to m do
35 begin
36 read(x,y);
37 writeln((get(y)-get(x-1))); //查询输出
38 z:=(x+y) shr 1;
39 if a[z]<>0 then begin add(z,-a[z]);a[z]:=0;end; //这里是更改值
40 end;
41 close(input);close(output);
42 end.

 

一段线段树的代码:

代码