树状数组主要用于解决:点更新,区间查询的问题。都是log(n)的复杂度
树状数组与线段树类似,都是一个树包含多个树。但树状数组更为随意,但更符合机器的规则,二进制运算明显更快。
与线段树的区别:线段树试用范围更广,解决的问题比树状数组多。树状数组的代码明显更加简短。
树状数组的大小只需开一个和原数组大小一样的即可
附主要代码:
//修改操作
void add(int k,int num)
{
while(k<=n)
{
tree[k]+=num;
k+=k&-k;
}
}
//查询操作
int read(int k)//1~k的区间和
{
int sum=0;
while(k)
{
sum+=tree[k];
k-=k&-k;
}
return sum;
}