码迷,mamicode.com
首页 > 其他好文 > 详细

树状数组

时间:2014-09-22 18:09:02      阅读:187      评论:0      收藏:0      [点我收藏+]

标签:blog   http   strong   for   2014   div   sp   on   log   

背景

需要维护前缀和  S[i]=A[1]+A[2]+...+A[i]。 但修改了任意一个 A[i] 后, S[i],...,S[n] 会发生变化,调整需要 O(n) 时间。

因此, 引入 “树状数组”,它的修改与求和都是 O(logn) 的,效率很高。

树状数组:即一个数组 C[],如下图.

bubuko.com,布布扣

核心函数:

int A[N] = {0,1, 2, 3, 4, 5, 6, 7, 8, 9};
int C[N] = {0};

int Lowbit(int x) 
{
	return x & (-x);
}

int Sum(int end) 
{
	int sum = 0;
	while(end > 0) {
		sum += C[end];
		end -= Lowbit(end);
	}
	return sum;
}
/*  update node i and its fathers */
void update(int i, int val) 
{
	while(i < N) {
		C[i] += val;
		i += Lowbit(i); // get its father
	}
}

void init() {
	for (int i = 1; i < N; ++i) 
		update(i, A[i]);
}

 C[i]表示 A[i-2k+1]到 A[i]的和(共 2k 个数),而 k 则是 i 在二进制时末尾 0 的个数,或者说是 i 用 2 的幂方和表示时的最小指数。

 

树状数组

标签:blog   http   strong   for   2014   div   sp   on   log   

原文地址:http://www.cnblogs.com/liyangguang1988/p/3986057.html

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