首页 > 编程语言 > 详细

树状数组

时间:2019-09-09 12:08:03      阅读:66      评论:0      收藏:0      [点我收藏+]

一维树状数组

int lowbit(int n) return n & (-n);

void update (int x, int y) {
    for (; x <= N; x += lowbit(x)) c[x] += y;
}

int sum (int x) {
    int ans = 0;
    for (; x; x -= lowbit(x)) ans += c[x];
    return ans;
}

二维树状数组

void update (int x, int y, int z) {
    for (int i = x; i <= N; i += lowbit(i)) {
        for (int j = y; j <= N; j += lowbit(j)) {
            c[i][j] += z;
        }
    }
}

int sum (int x, int y) {
    int ans = 0;
    for (int i = x; i; i -=lowbit(i)) {
        for (int j = y; j; j -= lowbit(j)) {
            ans += c[i][j];
        }
    }
    return ans;
}

树状数组:单点修改,区间查询

单点修改x, y => update(x, y)
区间查询 => sum(x)实现的是求[1, x]的和,求[L, R]的和就是sum(R) - sum(L - 1)

树状数组:区间修改,单点查询

树状数组:区间修改,区间查询

修改区间[l, r] => update(l, 1, startTree), update(r, 1, endTree);
区间查询[L, R] => sum(R, startTree) - sum(L - 1, endTree);

二维树状数组: 单点修改,区间查询

单点修改(x, y), z => update(x, y, z)
区间查询[X1, Y1], [X2, Y2] => sum(X2, Y2) - sum(X1 - 1, Y2) - sum(X2, Y1 - 1)+ sum(X1 - 1, Y1 - 1)

二维树状数组: 区间修改,区间查询

参考资料

1

树状数组

原文:https://www.cnblogs.com/liuzz-20180701/p/11490184.html

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