火龙信奥
  • 首页
  • 课程
  • 题库
  • 打卡
    • 代码对战
    • 快速对战
  • 题单
  • 团队
  • 荣誉墙
  • 商城
  • 登录 / 注册

树状数组图片

作者: 作者的头像   huolong , 时间:2025-08-02 13:54:29 , 所有人可见, 阅读  58

课外学习地址:https://blog.csdn.net/Antonio915/article/details/142336465

数状数组代码如下:

#include <vector>
using namespace std;

const int MAXN = 100005; // 根据题目需求设置最大值
int n;                  // 数组大小
int tree[MAXN];         // 树状数组

// lowbit 函数:返回 x 的二进制表示中最低位 1 所对应的值
inline int lowbit(int x) {
    return x & (-x);
}

// 单点修改:将原数组第 i 位置增加 x
void add(int i, int x) {
    while (i <= n) {
        tree[i] += x;
        i += lowbit(i);
    }
}

// 前缀和查询:返回原数组前 i 个元素的和(即 [1, i] 区间和)
int query(int i) {
    int res = 0;
    while (i > 0) {
        res += tree[i];
        i -= lowbit(i);
    }
    return res;
}

// 区间查询:返回 [l, r] 区间的和
int rangeQuery(int l, int r) {
    return query(r) - query(l - 1);
}


结构体的写法

#include <vector>
#include <cstring>  // 如果需要 memset 初始化

struct BIT {
    int n;
    std::vector<int> tree;

    // 构造函数:初始化大小为 n 的树状数组
    BIT(int size) : n(size) {
        tree.resize(n + 1, 0);  // 下标从 1 开始,所以大小为 n+1
    }

    // lowbit 函数:获取最低位的 1 所代表的数值
    inline int lowbit(int x) {
        return x & (-x);
    }

    // 单点增加:在位置 i 上加上 x
    void add(int i, int x) {
        while (i <= n) {
            tree[i] += x;
            i += lowbit(i);
        }
    }

    // 前缀和查询:返回 [1, i] 的和
    int query(int i) {
        int res = 0;
        while (i > 0) {
            res += tree[i];
            i -= lowbit(i);
        }
        return res;
    }

    // 区间查询:返回 [l, r] 的和
    int rangeQuery(int l, int r) {
        return query(r) - query(l - 1);
    }

    // 可选:批量初始化(传入原始数组)
    void init(const std::vector<int>& arr) {
        for (int i = 0; i < arr.size() && i < n; ++i) {
            add(i + 1, arr[i]);  // 原数组下标从 0 开始,BIT 从 1 开始
        }
    }
};

—— 本文来自火龙信奥(义乌睿码科技):义乌青少年信息学奥赛与编程教育平台,专注 CSP-J/S、NOIP、GESP 竞赛培训,线上线下融合教学,助力编程升学。网址:hlcoding.com

©2026加盟我们 | 关于我们 | ACM课程 | 常见问题 | 成果墙 | 评测记录 | 浙ICP备2021013995号
在线画图 | OI WIki | 打字练习
火龙信奥
请输入登录信息


请完成安全验证
验证码底图 滑块
向右拖动滑块完成验证
请输入用户名 / 绑定的手机号码



请输入注册信息(手机号验证码注册)





验证码5分钟有效,60秒内不可重复获取,每日最多3次

微信登录

微信登录二维码

正在生成二维码...

账号已过期,请续期。
去续期

绑定手机号

📱

为了更好地保护您的账号安全,享受完整的平台服务

请您尽快绑定手机号码