树状数组又称芬威克树,概念上是树状,实际上是使用数组实现的,表现为一种隐式数据结构,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;
}
一个例子: