Range Sum Query - Mutable 精简无递归线段树

Posted demian

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Range Sum Query - Mutable 精简无递归线段树相关的知识,希望对你有一定的参考价值。

操作: 

单点更新,区间求和

技术图片

区间求和:如sum [3,10) 需要对19,5,12,26节点求和即可。

观察可知,左端点为右子节点(奇数)时直接相加,右端点为左子节点(偶数)时直接相加,两边向中间移动并求其父节点。

 1 class NumArray 
 2 public:
 3     NumArray(vector<int> nums) 
 4         n = nums.size();
 5         tree.resize(n * 2); // 满二叉树
 6         buildTree(nums);
 7     
 8 
 9     void buildTree(vector<int>& nums) 
10         for (int i = n; i < n * 2; ++i) 
11             tree[i] = nums[i - n];
12         
13         for (int i = n - 1; i > 0; --i) 
14             tree[i] = tree[i<<1] + tree[i<<1|1];
15         
16     
17 
18     void update(int i, int val) 
19         tree[i += n] = val;
20         while (i > 0) 
21             tree[i / 2] = tree[i] + tree[i^1];
22             i /= 2;
23         
24     
25 
26     int sumRange(int i, int j)  
27         int sum = 0;
28         for (i += n, j += n; i <= j; i /= 2, j /= 2) 
29             if ((i & 1) == 1) sum += tree[i++];
30             if ((j & 1) == 0) sum += tree[j--];
31         
32         return sum;
33         
34 
35 private:
36     int n;
37     vector<int> tree;
38 ;

 

Refer:

Codeforces blog

以上是关于Range Sum Query - Mutable 精简无递归线段树的主要内容,如果未能解决你的问题,请参考以下文章

Range Sum Query - Mutable

307. Range Sum Query - Mutable

307 Range Sum Query - Mutable

Range Sum Query - Mutable

308. Range Sum Query 2D - Mutable

307. Range Sum Query - Mutable