Range Update and Range Queries in BIT

来源:互联网 发布:盈建科软件教学视频 编辑:程序博客网 时间:2024/06/06 07:22

在树状数组中,如果涉及到区间更新,我们可以多维护一棵BIT2:

Update Query Update(BITree1, l, val)Update(BITree1, r+1, -val)UpdateBIT2(BITree2, l, val*(l-1))UpdateBIT2(BITree2, r+1, -val*r)Range Sum getSum(BITTree1, k) *k) - getSum(BITTree2, k)

/* *    Binary Indexed Tree: Range Update & Rangre queries *    Complexity: O(qlog(n))  (q:query times, n:size of BIT) *    Mantain another BIT(BIT2) * *    Update(l, r, val): Add 'val' to all elements in the array from [l, r]. *    getRangeSum(l, r): Find sum of all elements in the array from[l, r]. *  *    Consider prefix sum: [1, k] *    Case 1: k < l *    Case 2: l <= k <= r *    Case 3: k > r * */#include <bits/stdc++.h>using namespace std;const int MAXN = 100000 + 7;int n;   // Size of BITint BIT1[MAXN], BIT2[MAXN];int lowbit(int x) {  return x & (-x);}int getSum(int k, int BIT[]) {  int sum = 0;  while(k > 0) {    sum += BIT[k];    k -= lowbit(k);  }  return sum;}// Update a node in BIT and all its' ancestorint update(int idx, int val, int BIT[]) {  while(idx <= n) {    BIT[idx] += val;    idx += lowbit(idx);  }}// Return the sum of array from [1, k].int sum(int k) {  return (getSum(k, BIT1) * k) - getSum(k, BIT2);}void updateRange(int val, int l, int r) {  update(l, val, BIT1);  update(r+1, -val, BIT1);  update(l, val * (l-1), BIT2);  update(r+1, -val * r, BIT2);}int rangeSum(int l, int r) {  return sum(r) - sum(l-1);}int main() {   n = 5;   int l = 1, r = 5, val = 5;   updateRange(val, l, r);   l = 2, r = 5, val = 10;   updateRange(val, l, r);   l = 1, r = 4;   printf("%d\n", rangeSum(l, r));   return 0;}


原创粉丝点击