树状数组小结

 

今天随着hdu3015的落马,菜鸟已经将网上说的各大oj上的树状数组切掉了。。没有了大牛告诉用

什么方法去做,以后的树状数组只能考自己的经验去切了。。先将近些天的心得,体会总结如下

。。

    树状数组,其本质是一个一维数组(有时候也用到二维树状数组),只是在存储信息时与普

通的数组有些区别(这就是树状数组的可爱之处)。。
    百度中有个图,入门很好,这里不附了。加油。
    树状数组的三大重要函数:
(1)
int lowbit(int k)//返回k的2进制数中的最后一个1所对应的数
{
    return k&(-k);
}
(2)
void Modify(int num,int v)
{
    while(num <= N)
    {
        tree[num] += v;
        num += lowbit(num);
    }
}
(3)
int sum(int num)
{
    int ans = 0;
    while (num > 0)//不可以有等号,否则死循环
    {
        ans += tree[num];
        num -= lowbit(num);
    }
    return ans;
}
这样得到的是比num小的数的总和,要得到比其大的要将(2)(3)中的内容交换内容。
杭电“敌兵布阵”是这赤裸裸的树状数组题目,也是入门的简单题目。从入门的抄写代码到自己

写杭电3015这样的麻烦题,思考,学习,永不止步。
    树状数组可以完成(1) 改点求段。(2) 改段求点。(3) 改点求点。 (4) 改段求段。
    题中提到两个变量,可以先按一个变量进行排序,然后对第二个变量进行求解,例如poj2352

stars、poj2481 cows 、poj3067 japan,将二维变成一维。。
    题目中提到某个变量是求两者中的max,或者min时,这样的题目往往是按照这个变量进行排

序,例如poj 1990 moofest和hdu3015disharmony trees。
    在做到poj apple tree时,感觉很神奇。但是后来想想,那其实不算什么,就是一个数的先

序遍历,看看遍历到的那个结点是什么,是第几次遍历到的,然后进行映射。当回溯到该结点时

再记录它的终止遍历次序。一遍DFS就可以完成。但是,其中将树建到结构体中,让后一次确定位

置,还是值得我深深学习的。
    说一下,树状数组是怎样完成高效的改变和查找的。一个int将其展成2进制数时,最多32位

,而树状数组真是用得这32位,也就是说假如有个数组有2^32个元素,将这个数组求和,普通数

组要循环2^32次,树状数组只需要32次。这是怎样的天上地下啊。。哇哇,效率,艺术。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值