树状数组
来源:互联网 发布:mac一键翻墙免费2016 编辑:程序博客网 时间:2024/06/05 08:01
树状数组是一个查询和修改复杂度都为log(n)的数据结构。主要用于查询任意两位之间的所有元素之和,但是每次只能修改一个元素的值。树状数组较线段树相比更加节省空间,但是很多线段树能解决的问题,树状数组不能解决
树状数组是用数组模拟一个树,基本上是有两种操作,更新和查找。
先说一下怎么模拟树。
a【】存的是每个值,c【】存的是某几个的和
c【1】:a【1】
c【2】:a【1】+a【2】;
c【3】:a【3】;
c【4】:a【1】+a【2】+a【3】+a【4】;
……………………
c【x】一定会包括a【x】,这里规定 c【x】包括 a【x-2^k+1(k为x的2进制末尾有多少个零)】-【x】;
而2^k的算法是:x&(-x);或者是x&(x^(x–1));
#include<cstdio>#include<iostream>using namespace std;int a[1000],c[1000];void add(int n,int num)//n表示第n个结点,num表示增加几{ a[n]+=num; while(n<=1000) { c[n]+=num; n+=n&(-n);//n&(-n)=2^k,(k为n表示为2进制后末尾0的个数); }}int getsum(int n){ int sum=0; while(n>0) { sum+=c[n]; n-=n&(-n); } return sum;}int main(){ add(12,12); cout<<getsum(12)<<endl; add(10,10); cout<<getsum(12)<<endl; return 0;}
2 0
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- 树状数组
- jdk7 api
- iOS开发:coredata的简单使用
- Java基础之JavaBean
- 半年收入超2亿RMB 独立游戏开发者的艰苦创业路
- Unity 游戏脚本解密
- 树状数组
- iOS之轻松上手block(上)
- 新版eclipse中NDK环境搭建(免Cygwin,超级快)
- 剑指offer系列之32:丑数
- linux 内核模块开发注意事项
- Python的OO思想
- Android的ListView多选删除Demo
- hdu2242 考研路茫茫——空调教室
- 第7周项目3多文件组织类的程序