树状数组

来源:互联网 发布:沙迪克火花机怎样编程 编辑:程序博客网 时间:2024/05/17 05:53

树状数组,顾名思义,是一个数组,形状是树状的。

如图:


为什么要用树状数组__为了方便。我们知道,如果要维护一个数组的前缀和,其复杂度是O(n^2)级别的。引入了树状数组后,复杂度骤然降至logn级别。

维护前缀和的时候,如果修改了原数组的一个值,那么其后的前缀和数组都要修改。那么能不能少修改一些,同时又能达到数组求和的目的呢。ok,树状数组就可以达到。

树状数组像并查集一样,小巧玲珑。爱煞了她。


给出其部分实现函数


int lowbit(int x){    return x & (-x);}long long sum(int n){    long long sum = 0;        while (n > 0)    {        sum += c[n];        n -= lowbit(n);    }        return sum;}void change(int i, int num){    while (i <= n)    {        c[i] += num;        i += lowbit(i);    }}

太简单了,简单的就像int gcd(int a, int b){return b ? gcd(b, a % b) : a;}

原创粉丝点击