总体上讲,树状数组是为了方便求数组前n项和的一种数据结构,在数组元素经常变动的情况下而对数组求和的时间要求很高时使用
个人感觉应用面比较窄。
模版:
void add(int m)
{
for(int i=m;i<=num ;ar[i]+=1,i+=lowbit(i));
}
int sum(int end)
{
int s=0;
while(end>0)
{
s+=ar[end];
end=end-lowbit(end);
}
return s;
}
int lowbit(int m)
{
return m&(-m);
}
其中sum是求1到end的所有元素和
add是对数组下标为m的元素加一后维护整个树状数组的过程
lowbit是求下一个坐标的方法
时间复杂度是logn,学习一下~