树状数组

来源:互联网 发布:linux虚拟文件系统vfs 编辑:程序博客网 时间:2024/06/05 06:58

昨天老师有讲到树状数组自己下来查了下资料及一些学习

参考资料http://www.cnblogs.com/zhangshu/archive/2011/08/16/2141396.html

#include <iostream>#include <stdio.h>#include <stdlib.h>#define N 16using namespace std;int a[N],c[N];int lowbit(int x)//取出x二进制从的最后一个1  例,x=6 二进制为0110 则lowbit(6)=0010  转换为10进制就是2{    return x&(-x);}void creat()//创建c[n]数组{    int k;    for(int i=1;i<=N;i++)    {        k=lowbit(i);        for(int j=i;j>i-k;j--)            c[i]+=a[j];        printf("%3d",c[i]);    }}int sum(int n)//求和{    int sum=0;    while(n>0)    {        sum+=c[n];        n-=lowbit(n);    }    return sum;}void modify(int x,int val)//修改{    while(x<=N)    {        c[x]+=val;        x+=lowbit(x);    }}int main(){    for(int i=1;i<=N;i++)    {        a[i]=rand()%10+1;        printf("%3d",a[i]);        c[i]=0;    }    printf("\n");    creat();    printf("\n");    int t;    t=sum(8);    printf("%d ",t);    return 0;}


0 0
原创粉丝点击