树状数组

来源:互联网 发布:厦门大学网络教育 编辑:程序博客网 时间:2024/06/05 11:15

树状数组(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] += deltavoid update(int t, int delta){    while(t < _max){        a[t] += delta;        t += t&(-t);    }}


我们利用上面的模板可以用来解决Hackerrank上另外一道题目Insertion Sort Advanced Analysis ,这道题目是问插入排序需要移动多少次元素,一种方法是由于移动总次数等于元素逆序对数目,可以用稍微修改归并排序的算法来统计。还有一种方法就是上面的树状数组。


此外树状数组的功能可以用线段树代替。

0 0