您的位置:首页 > 其它

树状数组入门

2012-04-24 23:14 190 查看

void add(int i,int val)//将第i个元素的值加上val
int sum(int i)//求前i项和
    int s=0;
    while(i>0)
            s+=c[i];
        i-=lowbit(i);
    }
    return s;
}

       根据上面的函数模板,我具个简单的例子,加深下对树状数组的理解

     题目大意:比如说有5个兵营地,开始时给出了每个兵营地的初始值(我们就假设每个兵营地的人数为1人),接下来我们可以有下面几个操作1.向第i个(1=<i<=5,后面的i相同)兵营地中加入val个人   2.向第i个兵营地中减少val人(我们可以理解为加入-val人)   3.查询第i个营地到第j个营地的人数和(也就是POJ1166我对它题意的简化)

      首先拿到这个问题后,你可能会觉得这题直接用普通数组就能实现,但是如果我们将兵营地的数量扩充到50000,对于操作的次数我们也取一个很大的值,也就是说我们需要频繁的在一个数量个数特别大的营地里进行加入,减少,和查询的操作,而时间我们也卡得很紧,普通数组一般方法实现的话一定会超时,这时你想到了什么呢?没错,这个性质不就适合树状数组吗(当然线段树也能很好的实现,线段树的相关知识我以后再更新)。

      重新回到题目,假设我们一共接到了3条命令,<1>向第3个营地里加入2人 <2>向第5个营地里减少1人 <3>查询第1个营地到第5个营地的人数总和。

      我们用数组c[i]=1(1=<i<=5)用来存放兵营地的初始值,<1>我们直接使用 add(3,2),此时数组c更新为了c[1]=1,c[2]=1,c[3]=3,c[4]=3,c[5]=1  <2>add(5,-1) 此时数组更新为c[1]=1,c[2]=1,c[3]=3,c[4]=3,c[5]=0  <3>sum(5) 此时就得出了结果    

 

      这篇随笔就是简单的介绍下树状数组吧,后面我也会慢慢的把做过的树状数组的题目解题报告贴到博客园上

      

               

 

 

内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: