树状数组

来源:互联网 发布: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
原创粉丝点击