a[x]表示原数组,c[x]表示前缀和数组
c[x]=(x-lowbit(x)]
lowbit(x)=2^k 表示求出x的二进制最后有k个0
我的一些理解 c[x]为到大于等于x层级之前的x'之间的a[x]之和,用公式表示就是上面的公式,二进制的原理。
##树状数组的功能
1.单点修改:在某个位置上加上一个数 O(log n)
2.区间查询:求一个前缀和 O(log n)
树状数组是一种在线的算法,可以在修改某个点的值之后继续求前缀和吗,也是和前缀和算法的去区别。
树状数组的的下标从1开始
int lowbit (x)
{
<!-- keywords:key1;key2; -->
<!-- description:this is a description -->
<!-- coverimage: -->
return x&-x;
}
int main ()
{
for (int i=1;i<=n;i++) 初始化
add(i,a[i]);
}
void add (int x, int v) 单点修改
{
for (int i=x;i<=n;i+=lowbit(i))
tr[i]+=v;
}
int query (int x) 区间查询
{
int res=0;
for (int i=x;i;i-=lowbit(i))
res+=tr[i];
}
本文章使用limfx的vscode插件快速发布