树状数组
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都是序号
也有种二分法的思想在里面,很难理解
原文地址:https://www.cnblogs.com/rign/p/10028575.html
时间: 2024-11-11 19:04:59