AcWing
  • 首页
  • 课程
  • 题库
  • 更多
    • 竞赛
    • 题解
    • 分享
    • 问答
    • 应用
    • 校园
  • 关闭
    历史记录
    清除记录
    猜你想搜
    AcWing热点
  • App
  • 登录/注册

区间和

作者: 作者的头像   想好好睡一觉 ,  2024-04-07 16:17:40 ,  所有人可见 ,  阅读 43


0


Problem: 307. 区域和检索 - 数组可修改

思路:

树状数组动态维护关键区间

Code

c++

class NumArray {
public:
    // 树状数组,存储每个关键区,长度即为nums数组的长度
    // 下标1开始算
    vector<int> tree;
    // 原数组
    vector<int> nums;
    int n;
    // 初始化tree和nums
    NumArray(vector<int>& nums) : tree((int)1e5,0), nums(nums),n(nums.size()) {
        //初始化树状数组
        for (int i = 0; i < nums.size(); i++) {
            int curr = i+1;
            tree[curr] += nums[i];
            if(curr+lowbit(curr)<=n)
            tree[curr+lowbit(curr)] += tree[curr]; 
        }
    }
    int lowbit(int i){
        return i&-i;
    }
    // 更新树状数组
    void update(int index, int val) {
        int deta = val - nums[index];
        //记得更新原数组!!!
        nums[index] = val;
        for(int i = index+1;i<=n;i+=lowbit(i)){
            tree[i]+=deta;
        }
    }
    // 求区间和
    int preSum(int idx){
        int s = 0;
        for(int i=idx;i>0;i-=lowbit(i)){
            s+=tree[i];
        }
        return s;
    }
    int sumRange(int left, int right) {
        return preSum(right+1)-preSum(left);
    }
};

0 评论

App 内打开
你确定删除吗?
1024
x

© 2018-2025 AcWing 版权所有  |  京ICP备2021015969号-2
用户协议  |  隐私政策  |  常见问题  |  联系我们
AcWing
请输入登录信息
更多登录方式: 微信图标 qq图标 qq图标
请输入绑定的邮箱地址
请输入注册信息