树状数组又叫二叉索引树主要用于单点更新区间求和,树状数组能做得用线段树都可以完成,那为什么还要用树状数组呢,因为树状数组的代码长度太短了。
树状数组的思想是很巧妙的运用了二进制最低位,如果不了解原理的小伙伴可以去B站上面有一个讲的很好的视频去看看,在这里只提供一下模板
视频链接 http://www.bilibili.com/video/av8841769/
int N,c[500005];//c为树状数组; int lowbit(int i){ return i&(-i); } void add(int i,int value)//将A[i]的值加上value{ while(i<=N){ c[i]+=value; i+=lowbit(i); } } int sum(int i) { int sum = 0; while(i>0){ sum+=c[i]; i -=lowbit(i); } return sum; } add(i,d);//初始化树状数组