【数据结构】树状数组
发布时间:2021-03-31 20:07 所属栏目:53 来源:网络整理
导读:树状数组 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都是序号 也有种二分法的思想在里面,很难理解 (编辑:ASP站长网) |
相关内容
网友评论
推荐文章
热点阅读