树状数组

作者: 不知名小号 | 来源:发表于2019-07-19 11:06 被阅读0次

用途

单点修改 查询前缀和

有时候会用到建多个树状数组的情况,所以我把建树状数组用的数组和数组长度作为参数。并且写了test函数。

既然是模板,就不再细述原理,读者可以查阅其他文章。建议参考书籍《算法竞赛进阶指南 李煜东》

代码

int lowbit(int x){
    return x & -x;
}
void add(int x, int val, int *bit, int n){
    // 让第x位加上val。bit是所用的数组,n是数组长度,下标从1开始哦
    for (int i = x; i <= n; i += lowbit(i)){
        bit[i] += val;
    }
}
int sum (int x, int *bit, int n){
    // 求x的前缀和,bit是所用的数组,n是数组长度,下标从1开始哦
    int ret = 0;
    for (int i = x; i > 0; i -= lowbit(i)){
        ret += bit[i];
    }
    return ret;
}
void TestBinaryIndexedTree(){
    int n, m, a[1000], x, y, z; // 
    cin >> n >> m; //n是数组长度,m是操作次数
    for (int i = 1; i <= n; i++) a[i] = 0; // 初始化为0
    for (int i = 1; i <= n; i++){
        cin >> x;
        add(i, x, a, n);
    }
    for (int i = 1; i <= m; i++){
        cin >> x >> y >> z;
        // x = 1代表把第y个数加z
        // x = 2代表查询区间y到z的元素和
        if (x == 1){
            add(y, z, a, n);
        }
        else if (x == 2){
            cout << sum(z, a, n) - sum(y - 1, a, n) << endl;
        }
    }
}

作者邮箱

1078539713@qq.com

相关文章

  • 数据结构(二)

    树状数组 POJ 1990: MooFest关于x坐标建立树状数组。先按照v值升序排序,逐个添加到树状数组里。每次...

  • 三种一维树状数组

    单点修改+区间查询 最基本的树状数组 树状数组入门 模板(洛谷P3374 【模板】树状数组1) 区间修改+单点查询...

  • 树状结构转一维数组

    树状结构转数组方法 声明树状对象

  • 树状数组

    复习一下树状数组 树状数组 一种用于处理单点修改和区间查询的数据结构。树状数组C的定义: C[x] = Sum ...

  • 树状数组模板复习

    树状数组模板复习

  • 树状数组求逆序对原理

    归并排序和树状数组都可以用nlogn的算法做到求出逆序对.但这里着重讲树状数组的原理与求法.树状数组最常用的方面就...

  • 「树状数组」

    题目传送门 poj1990题意: 农夫的N (N∈[1, 20,000])头牛参加了"MooFest"之后有了不...

  • 树状数组

    参见: https://www.cnblogs.com/hsd-/p/6139376.htmlhttps://bl...

  • 树状数组

    created by Dejavu*[完结] 简介树状数组(Binary Indexed Tree(BIT), F...

  • 树状数组

    对于一组数据a[],树状数组可实现以下操作: 1.给定x,求a[1]+a[2]+...+a[x]; 2.给定x,k...

网友评论

    本文标题:树状数组

    本文链接:https://www.haomeiwen.com/subject/xddjlctx.html