# 树状数组专题小结

树状数组专题小结

单点更新,区间查询

#define lowbit(i) ((i)&(-i))
int bt[maxn];

inline void update(int x){
    for(int i=x;i<=n;i+=lowbit(i))
        bt[i]+=1;
}
//返回前x个数的和
inline LL getSum(int x){
    LL ans=0;
    for(int i=x;i>0;i-=lowbit(i))ans+=bt[i];
    return ans;
}

区间更新,单点查询

区间更新通过差分实现,模板还是使用单点更新区间查询的模板。

int bt[maxn];//差分数组通过树状数组维护

#define lowbit(x) ((x)&(-x))
inline void add(int k,int x){
    for(int i=k;i<=n;i+=lowbit(i))bt[i]+=x;
}

inline int getSum(int k){
    int ans=0;
    for(int i=k;i;i-=lowbit(i))ans+=bt[i];
    return ans;
}

if(op=='Q')printf("%d\n",getSum(l));
else {
    sf(r);sf(d);
    add(l,d);add(r+1,-d);//差分操作
}

区间更新,区间查询

假设原数组为\(a[]\),差分数组为\(b[]\),则\(a[x]=\sum_{i=1}^{x}b[i]\)

\(sum[x]=a[1-x]=\sum_{i=1}^{x}\sum_{j=1}^{i}b[j]\)

通过转化:

区间求和变成维护两个树状数组,区间更新仍然使用差分实现

你可能感兴趣的:(# 树状数组专题小结)