树状数组 学习笔记(未完结)
树状数组和线段树的基本用法相同,大部分功能相同,不过树状数组使用了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.求逆序对
后续还有会不断积累的