树状数组(Binary Indexed Tree)是一个用数组表示的树形结构,用来处理下面一类常见问题:
已知数组A[1,n],我们在线对其进行:(1)修改某个元素A[i] (2)查询某个区间A[i...j]的元素和
具体可以参考文章《树状数组总结》,此外网站topcoder社区中上也有相关博客讲解了这个数据结构并且在解析里面有代码。
下面仍然是自己归纳的模板
int a[_max];
//统计a[0...t]中元素的和
int sum(int t){
int ans = 0;
while(t > 0){
ans += a[t];
t -= t&(-t);
}
return ans;
}
//修改元素使得 a[t] += delta
void update(int t, int delta){
while(t < _max){
a[t] += delta;
t += t&(-t);
}
}
我们利用上面的模板可以用来解决Hackerrank上另外一道题目Insertion Sort Advanced Analysis ,这道题目是问插入排序需要移动多少次元素,一种方法是由于移动总次数等于元素逆序对数目,可以用稍微修改归并排序的算法来统计。还有一种方法就是上面的树状数组。
此外树状数组的功能可以用线段树代替。