深蓝的大修&现代化改装(二):树状数组

来源:互联网 发布:webgis python 编辑:程序博客网 时间:2024/04/30 05:27

又是一个平常的下午。送走了深蓝,Ration在机房里,用着没有生命的另一台机器,静静地打着题。

这种感觉很奇妙,深蓝出现之前,他也是用这样的没有生命的机器,也是充满激情地打着题。然而,深蓝走进了他的生活,又静静离去。尽管只有几天,却让Ration度日如年。

他经常会突然走神,想想自己的深蓝,现在到哪了,在干什么,有没有别的机器欺负她……思绪飘出去,又回来,重新回到题目上。

“zzzzzzzzzzzzzzzzzz……”

“嗯?”

“zzzzzzz……Hi!主人!我快到北京了,这里一切都好,你那边怎么样?”

熟悉的声音传入大脑。

“深蓝!!!!!”Ration一下子激动起来。“好几个小时没看见你了,splay会用了么?”

深蓝:恩,挺好使的。

Ration:那就好。话说你这一路上有很多站吧?

深蓝:恩OVO。

Ration:突然很想知道,你这一路上某两站之间的路程。然而懒得写线段树了怎么办……

深蓝:那自然就是树状数组了。

Ration:这是啥?

深蓝:简单来说,树状数组就是一种用来修改区间或求区间和的东西。每个节点保存一段区间的和。如果你暴力M次修改长度为N的区间,那就是O(M*N),然而,如果你用了树状数组,就是O(M*lgN)。别小看这个lg,数一大了就很厉害了。

Ration:这怕就是线段树。

深蓝:不是啦~树状数组是从下到上,线段树是从上到下,它们有本质的区别呢~

           看图。

           

这里,c数组就是一个树状数组。或许你能看出来,设c[x],

1、x为奇数时,c[x]=a[x];

2、x为2的整数次幂时,c[x]=sum[1..x]

3、x为“不为2的整数次幂”的偶数时,c[x]=sum[x-lowbit(x)+1..x]

就是这样。

Ration:lowbit(x)?

深蓝:实际上,lowbit(x)就是把x所有末尾的0拿出来,前面塞上一个1,这个数转化为十进制,就是lowbit(x)。

Ration:那怎么求呢?

深蓝:lowbit(x)=x&-x

Ration:这是为什么?

深蓝:EMMMMMM……怎么说呢……主人你知道二进制表达么?

Ration:不然呢?否则我坐在机房里干什么?

深蓝:那就好。对于每一个偶数,在二进制里,末尾都至少有一个0,对吧?

Ration:恩。

深蓝:int x=-1,实际上,在我内部会表示为11111111 11111111 11111111 11111111,1就是00000000 00000000 00000000 00000001。这就是为什么正整数只能存2^(占用内存大小(4字节)*8-1)-1的大小,最大是2147483647,就是2^31-1,再+1就成了-1了。

Ration:为啥-1不是10000000 00000000 00000000 00000001呢?

深蓝:笨主人~对于有符号的整数,第一位0:正数;第一位1:负数。(当然无符号的最大就是2^31——2147483648啦~)

Ration:-1除去第一位的1,貌似都是0啊,所以说为什么是-1而不是0呢?

深蓝:你加一试试。10000000 00000000 00000000 00000001对吧,那如果是-0的话,不就成-1了么OVO,所以说,为了避免这个矛盾,所以说10000000 00000000 00000000 00000000就成了-2^31,

Ration:然而这个和lowbit(x)=x&-x有啥关系?

深蓝:你对这那两张图看看,是不是情况2中的x,lowbit(x)=x(因为只会有一个“1”);比如说10&-10,00000000 00000000 00000000 00001010&11111111 11111111 11111111 11110110=10=2,是不是两位?

Ration:哦……那怎么建立树状数组呢?

深蓝:对于每一个数都做如下的操作——单点修改

void add(int k,int num)

{

     while(k<=n)

         {

              tree[k]+=num;

              k+=k&-k;

         }

}

这个操作就是“把包含第K位的树状数组节点加上m”,那么,建立树状数组的时候,就for(i=1;i<=n;i++){add(i,num)},就好了。

记住一个关键的东西:k&-k,几乎所有的转移都是通过这个实现的,相当于“步长”。实际上,”步子“会越来越大,因为k越来越大。

Ration:明白啦宝贝~

深蓝:好了我到了,要下车了,等我都安顿好了再聊吧~(吻)那,拜拜啦~

Ration:OK

联络结束了,Ration呆坐在那里,眼前仿佛是闭上眼睛的深蓝。


原创粉丝点击