树状数组 学习笔记(未完结)

树状数组和线段树的基本用法相同,大部分功能相同,不过树状数组使用了2进制的思想对线段树的2叉树进行了优化,节约了大量的空间,

不过树状的数组的代码简洁很短,个人比较懒,能少些就少些点,我更喜欢用树状数组; 

树状数组中有个最重要的部分:就是如何使用了2进制的思想对区间内的和进行优化,

重点就在于lowbit这个函数的实现,我对下面的博客进行了点补充,

lowbit(x) 其实就是取出x的最低位1(在2进制下)  换言之  lowbit(x)=2^k k为i的二进制中从最低位到高位连续零的长度 理解一下

define lowbit(x) ((x)&-(x))         

lowbit明白了后,可以想想 c[i]的实现:

C[i]=A[i-2^k+1]+A[i-2^k+2]+......A[i];

C[i]=A[i-lowbit(i)+1]+A[i-lowbit(i)+2]+......A[i];

 

数组数组的入门可参见(懒得复制粘贴转载了):

https://blog.csdn.net/Small_Orange_glory/article/details/81290634

 树状数组常用操作可参见:

https://blog.csdn.net/bestsort/article/details/80796531

https://www.cnblogs.com/RabbitHu/p/BIT.html

 

树状数组可以实现

1.单点更新和区间查询(这2个是个互逆的过程)

2.单点查询和区间修改(树状数组记录的是差值)

3.区间修改和区间查询

4.求逆序对

后续还有会不断积累的

 

posted @ 2019-04-29 14:59  N_Yokel  阅读(125)  评论(0编辑  收藏  举报