struct fenwickTree{
vector<int> c;//下标从1开始
fenwickTree(){//默认构造函数
c.clear();
c.push_back(0);
}
fenwickTree(int n):c(n+1){//创建n个元素的树状数组
c[0]=0;
}
fenwickTree(vector<int> &a):c(a.size()+2){//a下标从0开始
for(register unsigned i=0;i<a.size();i++){
updata(i+1,a[i]);//对数列a建立树状数组
}
c[0]=0;
}
inline int lowbit(int x){
return x & -x;
}
void updata(unsigned int pos,int x){//在位置pos增加x
if(pos<1) return;
while(pos<c.size()){
c[pos]+=x;
pos+=lowbit(pos);
}
}
int sum(int pos){//求位置pos的前缀和
int ret=0;
while(pos>0){
ret+=c[pos];
pos-=lowbit(pos);
}
return ret;
}
};
树状数组模板类
最新推荐文章于 2024-06-07 20:33:59 发布