树状数组
手画的图有点丑emmm
第一个函数
lowbit函数(找出这个数对应的二进制从右往左数第一个为1的数字)
求lowbit有两种方法
1. int lowbit (int x)
{
return x&-x; //利用的是补码
}
2.
int lowbit(int i)
{
int ans=i-(i&(i-1)); //利用的是二进制
return ans;
}
第二个函数
更新函数
//更新单点
void add(int i,int c)
{
while(i<=n)
{
a[i]+=c;
i+=lowbit(i);
}
}
//举个栗子,如果想更新a[3],那么就要更新c4和c8,因为c4和c8都与a3有关,
//由上图可以看出
第三个函数
求和函数
int query(int i)
{
int sum=0;
while(i>0)
{
sum+=a[i];
i-=lowbit(i);
}
return sum;
}
//比如6的lowb为2,所以前六项的和应该是c6+c(6-2)