树状数组入门
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) 此时就得出了结果
这篇随笔就是简单的介绍下树状数组吧,后面我也会慢慢的把做过的树状数组的题目解题报告贴到博客园上
- 树状数组知识入门
- Ural1028(树状数组入门)
- POJ 2155 Matrix (二维线段树入门,成段更新,单点查询 / 二维树状数组,区间更新,单点查询)
- hdu 1166 线段树与树状数组入门 单点更新
- POJ-2763 Housewife Wind (树链剖分 入门题 树状数组 单点修改 区间查询)
- [HDU 1166]敌兵布阵[树状数组][入门]
- poj 1195 (二维树状数组入门,模板题)
- hdu_2795_线段树入门_线段树由树状数组转坑原本数组模拟
- 树状数组入门(求和)
- c /c++ 树状数组 入门
- hdu1166之树状数组入门
- poj 树状数组入门 2352
- nyoj 522 树状数组入门
- hdu 1541 树状数组入门
- 树状数组入门hdu1166,hdu1541,poj1195,poj2299
- HDU-1541(树状数组入门)
- 树状数组彻底入门
- HDU 1166 敌兵布阵 (树状数组入门)
- 树状数组彻底入门
- PKU 2299 求解逆序数(使用归并或者树状数组) 树状数组及入门知识