树状数组总结

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

 

树状数组是什么?

树状数组由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)。

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

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

posted @ 2018-09-12 20:02  zxza695  阅读(131)  评论(0编辑  收藏  举报

Contact with me