深蓝的大修&现代化改装(二):树状数组
来源:互联网 发布: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呆坐在那里,眼前仿佛是闭上眼睛的深蓝。
- 深蓝的大修&现代化改装(二):树状数组
- 深蓝的大修&现代化改装:BST之splay tree
- 树状数组(二)
- Ration与深蓝的下午茶(二):深蓝临危不乱的秘密——时间片
- NYOJ 士兵杀敌(二) 树状数组
- NYOJ - 士兵杀敌(二)(树状数组)
- NYOJ116 士兵杀敌(二)【树状数组】
- 【模板篇】树状数组们(二)
- 树状数组(二)与poj2155
- 树状数组(二)与poj2155
- 树状数组(二)与poj2155
- 树状数组(二)与poj2155
- 树状数组总结二
- 深蓝儿童的预言
- 铁路现代化技术系统整理(二)之TMIS
- 现代化的中国教育,缺失的不是钱,是思想(之二)--教师不再是舞台的主角
- 深蓝
- poj2155Matrix【二位树状数组】
- 正在执行的SQL
- C/C++宏定义中的#和##
- codefirces 420e(强连通分量)
- pyQt5-控件2
- MIT18.06线性代数课程笔记10:column space、row space、null space、left null space
- 深蓝的大修&现代化改装(二):树状数组
- Windows玩转Caffe(四): 配置Matlab接口之可视化初探
- DevExpress控件XtraTreeList的使用心得
- 【nginx】nginx反向代理请求响应报文大数据量时的json报文返回不完整
- hadoop编程(2)-准备编程和本地测试环境
- (四)spring配置bean的作用域
- Maya2016中MStatus中的改变
- Cg语言中文说明文档(四)
- Docker私有仓库镜像上传下载