树状数组的应用及拓展

Posted cwjr

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了树状数组的应用及拓展相关的知识,希望对你有一定的参考价值。

众所周知,树状数组是一个常用的数据结构。。。

1.为啥用树状数组:

如果用普通的前缀数组来维护前缀的信息,即使查询时o(1)的,但是修改就几乎要o(n),效率有时十分低下.

而树状数组却弥补了这一缺点,修改和查询都是o(logn)的

2.如何构建树状数组:

根据二次幂的性质,我们可以把一个数转化成一个独一无二的二进制数,所以,我们可以建立一个类似于二进制数的数组来维护前缀和

假如一个整数  x可以别分为x=2^i1+2^i2+2^i3...+2^im那么就可以把一个区间[1...x]分为(logx)的几个小区间

假设i1>i2>i3>...im

1长度为2^i1区间[1,2^i1]

2长度为2^i2区间[2^i1+1,2^i1+2^i2]

3长度为2^i3区间[2^i2+2^i1+1,2^i1+2^i2+2^i3]

...

这些小区间的特点是长度为二进制分解下最小的二次幂,也就是lowbit(x);

 

 例如11=8+2+1=2^3+2^1+2^0,那么区间11可以分为[1,8],[9,10],[11],长度分别为lowbit(8)=8,lowbit(10)=2,lowbit(11)=1

  • C[1] = A[1];
  • C[2] = A[1] + A[2];
  • C[3] = A[3];
  • C[4] = A[1] + A[2] + A[3] + A[4];
  • C[5] = A[5];
  • C[6] = A[5] + A[6];
  • C[7] = A[7];
  • C[8] = A[1] + A[2] + A[3] + A[4] + A[5] + A[6] + A[7] + A[8];

技术图片

 

以上是关于树状数组的应用及拓展的主要内容,如果未能解决你的问题,请参考以下文章

51nod 1286 三段子串(树状数组+拓展kmp)

树状数组及二维树状数组

二维树状数组及(不会用到的)三维树状数组

树状数组的原理和基础应用

树状数组求逆序数及变形(个人理解)

浅析树状数组(二叉索引树)及一些模板