【树状数组】学习树状数组

一维树状数组

我在网上搜索到一些优秀的博客学习的树状数组,以下是参考的博客:

1.搞懂树状数组:点击打开链接

2.树状数组学习笔记:点击打开链接

3.完全认识树状数组:点击打开链接

4.还有算法训练指南中的讲解;

以上的链接是关于树状数组的原理讲解

随着时间推移可能会忘记,做题的时候可以画一个图解便于回忆树状数组的原理(训练指南上的图解比较好! )


一棵典型的BIT:



更新:



统计:




//心得:

刚开始用树状数组写题的时候,不知道如何下手。这个树状数组的更新函数add(),向上更新。很多的题目的是这样调用的:add(x,1);就是标记x了一次。一般都是这么用的,后面几篇博客是题目;


//树状数组使用注意:

1.离散化;

2.如果代码TLE的话,检查一下是不是下标0的问题;

3.题目若需排序,考虑一下应当怎样正确排序;

4.代码一定要敲仔细;


下面是自己学习的代码:

int lowbit(int k)  //把k的二进制的高位1全部清空,只留下最低位的1;
{
    return k&(-k);
}

int sum(int x)
{
    int ret=0;
    while(x>0)
    {
        ret+=C[x];
        x-=lowbit(x);
    }
    return ret;
}

void add(int x,int d)
{
    while(x<=N)
    {
        C[x]+=d;
        x+=lowbit(x);
    }
}


二维树状数组

参考博客:点击打开链接点击打开链接(内有二维、三维模板)

int N;
int c[maxn][maxn];
inline int lowbit(int t)
{
    return t&(-t);
}
void add(int x,int y,int v)
{
    for (int i=x; i<=N; i+=lowbit(i))
        for (int j=y; j<=N; j+=lowbit(j))
            c[i][j]+=v;
}
int query(int x,int y)
{
    int s=0;
    for (int i=x; i>0; i-=lowbit(i))
        for (int j=y; j>0; j-=lowbit(j))
            s+=c[i][j];
    return s;
}
int sum(int x,int y,int xx,int yy)
{
    x--,y--;
    return query(xx,yy)-query(xx,y)-query(x,yy)+query(x,y);
}



  • 2
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值