码迷,mamicode.com
首页 > 编程语言 > 详细

树状数组(Binary Indexed Tree)

时间:2019-06-04 13:31:35      阅读:112      评论:0      收藏:0      [点我收藏+]

标签:特点   判断   模板   int   lowbit   bit   turn   query   经典   

特点

树状数组常用于查询前缀和,前缀和通过差分可以得到区间和,并支持单点修改
单点修改和查询前缀和的时间复杂度均为\(O(n\log_2 n)\)

数据结构与基本操作

假定有\(a_1, a_2, ..., a_n\)共n个数,我们使用数组bit[n+1] = {0}, 其中0位置不存储任何信息,仅作为边界判断

i最低位的2的幂

int lowbit(int i){ return i & (-i);}

前缀和

int sum(int i){
    int r = 0;
    while(i > 0){
        r += bit[i];
        i -= lowbit(i)
    }

    return r;
}

单点修改

    void update(int i, int d){
        while(i <= n){
            bit[i] += d;
            i += lowbit(i)
        }
    }

初始化

    for(int i = 0; i < a.size(); i++)
        update(i + 1, a[i]);

经典例题

模板题

307. Range Sum Query - Mutable
493. Reverse Pairs

离散化

315. Count of Smaller Numbers After Self
327. Count of Range Sum

树状数组(Binary Indexed Tree)

标签:特点   判断   模板   int   lowbit   bit   turn   query   经典   

原文地址:https://www.cnblogs.com/qbits/p/10972651.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!