首页 > 编程语言 > 详细

【模板】树状数组

时间:2019-10-11 15:28:07      阅读:78      评论:0      收藏:0      [点我收藏+]
int n;
const int maxn = 100010;
int a[maxn];
int sum1[maxn];
int sum2[maxn];

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

inline void updata(int i, int k)
{
    int x = i;
    while (i <= n)
    {
        sum1[i] += k;
        sum2[i] += k * (x - 1);
        i += lowbit(i);
    }
}

inline int get_sum(int i)
{
    int res = 0;
    int x = i;
    while (i > 0)
    {
        res += x * sum1[i] - sum2[i];
        i -= lowbit(i);
    }
    return res;
}

int main()
{
    //输入n
    for (int i = 1; i <= n; i++)
    {
        //输入a[i]
        updata(i, a[i] - a[i - 1]);
    }
    int l, r, t;
    //输入l,r,t
    //[l,r]区间加t
    updata(l, t);
    updata(r + 1, t);
    //输入l,r
    int sum;
    //询问[l,r]区间和
    sum = get_sum(r) - get_sum(l - 1);
}

 

【模板】树状数组

原文:https://www.cnblogs.com/thjkhdf12/p/11653634.html

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