树状数组及二维树状数组
一直以为树状数组能用线段树水过去,直到我今天碰上了树状数组模板题。 然后就是开始认真的学习树状数组,突然发现怎么这么好写qwqqqq。 部分图片转自 https://www.cnblogs.com/hsd-/p/6139376.html 一.树状数组 树状数组是一种数据结构,核心思想是利用二进制的补码思想。 首先就是树状数组的结构图 然后我们对他进行变形 是不是感觉更好理解了呢? 然后我们对其进行标号 c数组表示的是记录的值,A数组表示的是原序列。然后就是所有关于树状数组的博客都会有的c数组的存值的展示,博主较懒就不写了,具体看推荐博客。 最重要的性质是 C[i]=A[i-2^k+1]+A[i-2^k+2]+......A[i]; (k为i的二进制中从最低位到高位连续零的长度) 上面说k是二进制中最低位到最高位的连续零的长度也就是6的二进制是110,那么k就是1,然后我们带入: c[6]=A[6-2+1]+A[6-2+2]=A[5]+A[6] 看,是不是与上方式子相符,这就是 lowbit 要实现的功能。那么, lowbit 实现的原理是啥呢? 先粘一下 lowbit 函数的代码 1 int lowbit(int k) 2 { 3 return k&(-k); 4 } lowbit k&(-k)是啥意思呢? -k是k的补码,也就是反码+1,反码是啥自行百度,反正也很简单。