加入收藏 | 设为首页 | 会员中心 | 我要投稿 核心网 (https://www.hxwgxz.com/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 电商 > 正文

【数据结构】树状数组

发布时间:2021-04-01 01:17:31 所属栏目:电商 来源:网络整理
导读:树状数组 ta的本质是利用二进制的性质维护一组数据 最常用的操作就是求前缀和 int lowbit( int x){ return x(- x); /* 通过补码,清空高位1,只留下最后一个1 */ } ? void add( int x, int val){ while (x= n){ c[x] += val; x += lowbit(x); } /* 更新时,

树状数组

ta的本质是利用二进制的性质维护一组数据

最常用的操作就是求前缀和

int lowbit(int x){
    return x&(-x);
    /*通过补码,清空高位1,只留下最后一个1*/
}

?

void add(int x,int val){
    while(x<=n){
        c[x]+=val;
        x+=lowbit(x);
    }
    /*更新时,需要去把该节点所被管辖的结点全部更新
        你比如说1101->1110
        所被管辖的结点 1110->10000
        被管辖的结点,是利用二进制来求的
        最低位1管辖着所有后面的0
    */
}
void sum(int r){
    int sum=0;
    while(r>0){
        sum+=c[r];
        c-=lowbit(r);
    }
    return sum;
    /*跟更新结点是一样的,只不过是逆序操作
        比如1101->1000 1100 1101 的和
    */
}

?

二进制的求和视角

S110=S100【S010(A001+A010)+S100(A011+A100)】+S110(A101+A110)

也就是说只能有100 和 010 管控

只有一个1的时候才能管控剩余的0,或者说是最低位的1?,前面的1都是序号

也有种二分法的思想在里面,很难理解

(编辑:核心网)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    热点阅读