码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组

时间:2020-02-28 01:06:07      阅读:66      评论:0      收藏:0      [点我收藏+]

标签:info   size   操作   答案   倒序   alt   http   style   log   

# 支持的操作

1)快速求前缀和 O(log n)

2) 修改某一个数 O(logn)

# 原理

原数组的长度为x的话,x的二进制为(下标从 1 开始)

x = 2i1+2i2+2i3+.......+2im 

那么按照x的二进制可以讲区间划分为 log x 个区间。分别为

[ x-2i1+1 +1 , x ] , 区间长度为2i1

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

[ x-2i1 -2i2 -2i3 +1 , x -2i1 -2i2] , 区间长度为2i3

......

[ x-2i1 -2i2 -2i3 ......-2im + 1 , x -2i1 -2i2 -......-2i[m-1]] , 区间长度为2im

a数组是原数组,c数组是求和后的数组,

技术图片

 

 

查询操作,如图,2的倍数的lowbit是其本身,其他的一直算即可

单点增加运算通过lowbit算其父节点,通过+lowbit(x)就能知道其父节点。

在执行所有操作之前需要对树状数组进行初始化  

# 树状数组求逆序对

在a的数值范围上面建立一个树状数组,树状数组统计的前缀和是点的个数。

步骤:
1)查询前缀和 [ 1 , a[i]-1 ],并累加到答案中

2)执行单点增加操作,即将 a[i] 数值在树状数组中+1,维护前缀和,这表示数值 a[i] 出现了一次

3)ans就是所有的逆序对

因为是倒序扫描,已经出现的数就是在 a[i] 后面的数,所以查询的是在 i 后面,小于a[i]的数值个数有多少个

时间复杂度为O ( (N + M) log M) , M为数值范围的大小。

查询的复杂度为O(M * log M)

加入的复杂度为O(N * logM)

 

树状数组

标签:info   size   操作   答案   倒序   alt   http   style   log   

原文地址:https://www.cnblogs.com/hhyx/p/12375343.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!