树状数组--一维模板

来源:互联网 发布:数据分析师证书难不难 编辑:程序博客网 时间:2024/05/22 13:10

树状数组不是很懂只能给个模板了。
原理是二分法。

#include<cstdio>#include<cstring>#include<algorithm>using namespace std;int tree[100005];int n;int lowbit(int x){    return x&(-x);}void add(int x,int y){    while(x<=n)    {        tree[x]+=y;        x+=lowbit(x);    }}int sum(int i){    int s=0;    while(i>0)    {        s+=tree[i];        i-=lowbit(i);    }    return s;}int main(){    while(scanf("%d",&n)!=EOF)    {        memset(tree,0,sizeof(tree));//初始化数组         for(int i=1;i<=n;i++)//创建树状数组         {            int x;            scanf("%d",&x);            add(i,x);            sum(i);        }        for(int i=1;i<=n;i++)         printf("%d%c",tree[i],i==n?'\n':' ');//改变前的树状数组        int x,y;        scanf("%d%d",&x,&y);        add(x,y);   //使第x个数加上y         for(int i=1;i<=n;i++)        printf("%d%c",tree[i],i==n?'\n':' ');//改变后的树状数组         int l;        scanf("%d\n",&l);        printf("%d",sum(l));//求前l项的和     }    return 0;}

输入:
4
1 2 3 4
2 1
3
输出
1 3 3 10 //改变前的树状数组
14 3 11 //改变后的树状数组
7 //改变后数组的前n项和