树状数组(fenwick tree)

  树状数组又称芬威克树,概念上是树状,实际上是使用数组实现的,表现为一种隐式数据结构,balabala...详情请见:https://en.wikipedia.org/wiki/Fenwick_tree

  其中`i += (i & -i)`的相当于求 $ 2^{n-1} , n \in 1,2,3... $,还可以写成`i += (i & (i ^ (i - 1)))`。

  code:

#include <iostream>
#define LSB(i) (i & -i)
const int M = 10001;
int bit_tree[M];
int freq[M];
int getsum(int index)
{
	int sum = 0;
	for (index += 1; index > 0; index -= LSB(index))
		sum += bit_tree[index];
	return sum;
}
void update(int n, int index, int val)
{
	for (index += 1; index <= n; index += LSB(index))
		bit_tree[index] += val;
}
void init(int freq[], int n)
{
	for (int i = 1; i <= n; i++)
		bit_tree[i] = 0;
	for (int i = 0; i < n; i++)
		update(n, i, freq[i]);
}
int main()
{
	int n;
	std::cin >> n;
	for (int i = 0; i < n; i++)
		std::cin >> freq[i];
	init(freq, n);
	for (int i = 0; i < n; i++)
	std::cout << getsum(i) << std::endl;
	for (int i = 1; i <= n; i++)
		std::cout << bit_tree[i] << ' ';
	return 0;
}

  一个例子:

 

转载于:https://www.cnblogs.com/darkchii/p/9397211.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值