lowbit:
lowbit(x)=x&(-x)
树状数组:
树状数组的功能:
数组
在O(1)的时间复杂度实现单点加:
在O(lng n)的时间复杂度实现查询前缀和:
树状数组的定义:
查询前x项的和操作:
ll query(int x){ll s=0;for( ; x; x-=x&(-x)){s+=c[x];}return s;
}
单点加操作:
//原数组长度为n
void modify(int x,ll s){for(;x<=n;x+=x&(-x)){c[x]+=s;}//如果需要别忘了把元素组对应的一位也进行变换
}
构造一个树状数组:
//原数组长度为n
scanf("%d",&n);for(int i=1;i<=n;i++){scanf("%d",a+i);modify(i,a[i]);}
在输入元素的每一位时对应的在树状数组的位置加上该值。