首页 > 编程语言 > 详细

数据结构 树状数组模板

时间:2021-01-29 23:23:43      阅读:21      评论:0      收藏:0      [点我收藏+]

树状数组

单点更新 区间查询

int a[maxn],c[maxn]; //原数组和树状数组

int lowbit(int x){ return x&(-x); }

void updata(int i,int k) //第 i 个元素加 k
{  
    while(i <= n)
    {
        c[i] += k;
        i += lowbit(i);
    }
}
int getsum(int i) //前i个和
{    
    int res = 0;
    while(i > 0)
    {
        res += c[i];
        i -= lowbit(i);
    }
    return res;
}

区间更新 单点查询

//利用原数组的差分数组建树
int a[maxn] = {0},c[maxn]; //原数组和树状数组

int lowbit(int x){ return x&(-x); }

void updata(int i,int k)  //第 i 个元素加 k
{   
   while(i <= n)
   {
       
       c[i] += k;
       i += lowbit(i);
   }
}
 
int getsum(int i) //前i个
{
    int res = 0;
    while(i > 0)
    {
        res += c[i];
        i -= lowbit(i);
    }
    return res;
}

/*
    updata(i,a[i] - a[i-1]);   //差分建树
    //[x,y]区间内加上k
    updata(x,k);         //A[x] - A[x-1]增加k
    updata(y+1,-k);      //A[y+1] - A[y]减少k
    //单点查询 差分建树所以单点查询变成了求和
    int sum = getsum(i);
*/

数据结构 树状数组模板

原文:https://www.cnblogs.com/hucorz/p/14346684.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!