树状数组

来源:互联网 发布:脸型测试软件 编辑:程序博客网 时间:2024/06/05 20:24

C++实现树状数组(结构体版)编辑

#include<iostream>#include<vector>using namespace std;class BinTree:vector<int>{    public:        explicit BinTree(int k=0)//默认初始化一个能保存k个元素的空树状数组        {            assign(k+1,0);//有效下标从1开始,0仅作逻辑用处        }        int lowbit(int k)        {            return k&-k;            //也可写作x&(x^(x–1))        }        int sum(int k)//求第1个元素到第n个元素的和        {            return k>0?sum(k-lowbit(k))+(*this)[k]:0;        }        int last()//返回最后一个元素下标        {            return size()-1;        }        void add(int k,int w)//为节点k加上w        {            if(k>last())return;            (*this)[k]+=w;            add(k+lowbit(k),w);        }};int main(){    BinTree test(123);    test.add(27,72);    cout<<test.sum(26)<<' '<<test.sum(27)<<' '<<test.sum(123);}

C++实现树状数组(函数版)编辑

#include<iostream>using namespace std;int n,m,i,num[100001],t[200001],l,r;//num:原数组;t:树状数组 int lowbit(int x){    return x&(-x);}void change(int x,int p)//将第x个数加p {    while(x<=n)    {        t[x]+=p;        x+=lowbit(x);    }    return;}int sum(int k)//前k个数的和 {    int ans=0;    while(k>0)    {        ans+=t[k];        k-=lowbit(k);    }    return ans;}int ask(int l,int r)//求l-r区间和 {    return sum(r)-sum(l-1); }int main(){    cin>>n>>m;    for(i=1;i<=n;i++)    {        cin>>num[i];        change(i,num[i]);    }    for(i=1;i<=m;i++)    {        cin>>l>>r;        cout<<ask(l,r)<<endl;    }    return 0;}
void add(int k,int num)  {      while(k<=n)      {          tree[k]+=num;          k+=k&-k;      }  }  int read(int k)//1~k的区间和  {      int sum=0;      while(k)      {          sum+=tree[k];          k-=k&-k;      }      return sum;  }  

http://blog.csdn.net/zearot/article/details/45028723
http://blog.csdn.net/int64ago/article/details/7429868

0 0
原创粉丝点击