首页 > 编程语言 > 详细

【数据结构】树状数组(简单名次树)

时间:2021-01-12 09:47:14      阅读:39      评论:0      收藏:0      [点我收藏+]
struct BinaryIndexTree {

    static const int MAXN = 500000 + 10;

    int n, A[MAXN];
    int cnt[MAXN], siz[MAXN];

    void InitValue() {
        n = 0;
    }

    void UseValue(int val) {
        A[++n] = val;
    }

    void Init() {
        sort(A + 1, A + 1 + n);
        n = unique(A + 1, A + 1 + n) - (A + 1);
        memset(siz, 0, sizeof(siz[0]) * (n + 1));
    }

    void Insert(int val, int num) {
        int pos = lower_bound(A + 1, A + 1 + n, val) - A;
        cnt[pos] += num;
        for(int i = pos; i <= n; i += i & (-i))
            siz[i] += num;
    }

    void Remove(int val, int num) {
        int pos = lower_bound(A + 1, A + 1 + n, val) - A;
        num = min(cnt[pos], num);
        cnt[pos] -= num;
        for(int i = pos; i <= n; i += i & (-i))
            siz[i] -= num;
    }

    int GetRank(int val) {
        int pos = lower_bound(A + 1, A + 1 + n, val) - A, res = 1;
        for(int i = pos - 1; i; i -= i & (-i))
            res += siz[i];
        return res;
    }

} bit;

【数据结构】树状数组(简单名次树)

原文:https://www.cnblogs.com/purinliang/p/14265133.html

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