树状数组总结

这次复习树状数组主要加深了对于原理的理解。

树状数组是什么?

树状数组由3个部分组成:

1.lowbit()//求lowbit值   lowbit(x)=x&(-x)//这个比较方便,记住就好。

int lowbit(int x){
    return x&(-x);
}

2.update()//修改

void update(int p,int w){
    while(p<=n){
        c[p]+=w;
        p+=lowbit(p);
    }
}

3.sum()//求和

long long int sum(int p){
    long long int tot=0;
    while(p){
        tot+=c[p];
        p-=lowbit(p);
    }
    return tot;
}

树状数组能干什么?

1.(一维和二维)单点修改,区间查询

2.(一维和二维)区间修改,单点查询

3.(一维和二维)区间修改,区间查询

4.(一维和二维)区间修改,区间查询

树状数组中数组C[X]的含义是什么?

C【X】表示的是[X-lowbit(x),X]的区间和。

update更新的是什么?

如果在x位加上w,每次更新c[x+lowbit(x)],其实就是从更新[1,x+lowbit(x)],所以求和的时候不会重复加上w.

单点修改怎么办?

单点修改只需要弄一个差分数组就行了。

二维树状数组:

每次操作的时间复杂度是((log(n))^2)。

(区间修改,区间查询)(区间修改,区间查询)

为什么要用差分,因为区间修改如果不用差分得每个每个修改,时间复杂度过不去。

原文地址:https://www.cnblogs.com/sky-zxz/p/9636976.html