树状数组

95次阅读
没有评论

共计 513 个字符,预计需要花费 2 分钟才能阅读完成。

  线段树 树状数组
结构 二叉树 阉割了一些点
空间
时间
用途 维护区间信息(区间gcd,区间和,区间最大/小) 维护具有 结合律可差分 的信息,入加法、异或等。
树状数组能解决的问题是线段树能解决问题的子集。
性能 代码长,时间常数大。 代码短,时间常数小。

树状数组维护的是一个前缀区间

我们观察一个数的二进制,假如这个数是,我们想算前个数的前缀和,我们就可以将这7个数拆分给这些编号来进行分配。那么问题就是如何分配数,把哪些数交给谁。

我们观察这个图:

树状数组

可以发现每个数都分给了 对应的编号,我们设为一个二进制数中最低位1所在的二进制位,那么每个编号管理的数的数目就是


函数(提取x对应的低位2次幂)

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

加点

void add(int x,int k){
    while(x<=n){
        s[x] += k ;
        x += lowbit(x) ;
    }
}

查询

int querry(int x){
    int t = 0 ;
    while(x){
        t += s[x] ;
        x -= lowbit(x) ;
    }
    return t ;
}

参考链接

 

正文完
 0
ouyu69
版权声明:本站原创文章,由 ouyu69 于2024-10-21发表,共计513字。
转载说明:除特殊说明外本站文章皆由CC-4.0协议发布,转载请注明出处。
文章搜索
评论(没有评论)