树状数组的小总结

1.树状数组在很多情况下可以替代线段树,而且树状数组的代码简洁好写,所以能用树状数组的地方我还是会树状数组而不是线段树;

2.树状数组的常用的函数有以下这些:

  

int lowbit(int x)
{
    return x&(-x);
}
void update(int x,int num)
{
    while(x<=n)
    {
        sum[x]+=num;
        x+=lowbit(x);
    }
}
/*从下往上修改,对应线段树的点修改*/
int query(int x)
{
    int s=0;
    while(x>0)
    {
        s+=sum[x];
        x-=lowbit(x);
    }
    return s;
}
/*从上向下统计,对应线段树的区间统计*/
void update(int x,int num)
{
    while(x>0)
     {
         d[x]+=num;
         x-=lowbit(x);
     }
}
/*从上往下修改,需要两次,第二次要把多加的区间减掉我感觉像是线段树的lazy标记,不知道对不对*/
int getSum(int x)
{
    int s=0;
    while(x<=N)
     {
         s+=d[x];
         x+=lowbit(x);
     }
    return s;
}
/*点查询,从下向上统计,对应线段树的点查询要加上lazy标记*/

3.某些题目的区间修改可以改成点修改,然后区间查询如hdu1556,poj2155(二维的树状数组好神奇);

posted @ 2016-03-24 22:47  LittlePointer  阅读(142)  评论(0编辑  收藏  举报