307. 区域和检索 - 数组可修改(树状数组)

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

tree的下标注意从1 到 n + 1,从0开始就死循环了

例题:

307. 区域和检索 - 数组可修改 - 力扣(LeetCode)

class NumArray {
public:

    vector<int> c;
    vector<int> array;
    int n = 0;

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

    NumArray(vector<int>& nums) {
        n = nums.size();
        c.resize(n + 1, 0);  // 树状数组使用1-based indexing
        array.resize(n, 0);
        
        // 初始化数组
        for (int i = 0; i < n; i++) {
            array[i] = nums[i];
        }
        
        // 构建树状数组
        for (int i = 0; i < n; i++) {
            add(i, nums[i]);
        }
    }

    void add(int index, int val) {
        // 转换为1-based indexing
        for (int i = index + 1; i <= n; i += lowbit(i)) {
            c[i] += val;
        }
    }

    int query(int x) {
        int ret = 0;
        // 转换为1-based indexing
        for (int i = x + 1; i > 0; i -= lowbit(i)) {
            ret += c[i];
        }
        return ret;
    }
    
    void update(int index, int val) {
        int add_val = val - array[index];
        add(index, add_val);
        array[index] = val;
    }
    
    int sumRange(int left, int right) {
        int ret = query(right);
        if (left > 0) ret -= query(left - 1);
        return ret;
    }
};

/**
 * Your NumArray object will be instantiated and called as such:
 * NumArray* obj = new NumArray(nums);
 * obj->update(index,val);
 * int param_2 = obj->sumRange(left,right);
 */

 

posted @ 2026-01-12 22:27  WTSRUVF  阅读(1)  评论(0)    收藏  举报