树状数组

树状数组(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 ,这道题目是问插入排序需要移动多少次元素,一种方法是由于移动总次数等于元素逆序对数目,可以用稍微修改归并排序的算法来统计。还有一种方法就是上面的树状数组。


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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值