【数据结构】树状数组
发布时间:2021-03-31 20:22:01 所属栏目:安全 来源:网络整理
导读:树状数组 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都是序号 也有种二分法的思想在里面,很难理解 (编辑:南平站长网) 【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容! |

