树状数组是一种单点修改并查询前缀和的数据结构
查询和修改时间复杂度都是log(n)
对于树状数组我们首先需要知道lowbit的概念
lowbit即是x & -x
通俗点是一个数二进制下的从后往前数第一个1所对应的值
具体算法的话就是两个
一个是修改函数如下
1 void add(int pos, int w) 2 3 { 4 5 while(pos <= n) 6 7 { 8 9 c[pos]+=w;10 11 pos+=lowbit(pos);12 13 }14 15 }
一个是查询如下
1 int sum(int pos) 2 3 { 4 5 int ret = 0; 6 7 while (pos > 0) 8 9 {10 11 ret+=c[pos];12 13 pos-=lowbit(pos);14 15 }16 17 return ret;18 19 }
很好写也易于理解
我第一次自己写的时候初始赋值错了导致初始化复杂度过大
可以初始赋值的时候就使用add( i , a[i] )