2020.11.14的 HTML程式碼註釋
阿新 • • 發佈:2020-11-29
單點更新,區間查詢
class Binary_indexed_trees{ private: int n; vector<int> tree; public: Binary_indexed_trees(int _n):n(_n), tree(_n + 1) {} static constexpr int lowbit(int x){ return x & (-x); } void update(int x, int d){ while(x <= n){ tree[x] += d; x += lowbit(x); } } int sum(int x) const { int ans = 0; while(x){ ans += tree[x]; x -= lowbit(x); } return ans; } };
區間更新,單點查詢
單點的值用字首和表示 即 c[i] = a[1] + a[2] + ... + a[i - 1] + a[i]
區間[x, y]
增加k
即a[x] + k
, a[y + 1] - k
,這樣對於x->y
的字首和都加k
,y+1
字首和並沒變
class BIT{ public: int n, m; vector<int> c; BIT(int _n) : n(_n), c(_n + 1){ } int lowbit(int x){ return x & (-x); } //更新單點資訊 void _update(int i, int k){ while(i <= n){ c[i] += k; i += lowbit(i); } } int getSum(int i){ int res = 0; while(i > 0){ res += c[i]; i -= lowbit(i); } return res; } //區間[x, y]增加k void update(int x, int y, int k){ _update(x, k); _update(y + 1, -k); } };
區間更新,區間查詢
class BIT{ private: int n; vector<int> sum1, sum2; public: BIT(int _n) : n(_n), sum1(_n + 1, 0), sum2(_n + 2, 0){} static constexpr lowbit(int x){ return x & (-x); } //更新單點 void _update(int x, int k){ int i = x; while(x <= n){ sum1[x] += k; sum2[x] += (i - 1) * k; x += lowbit(x); } } // 更新區間 void update(int x, int y, int k){ _update(x, k); _update(y + 1, -k); } // 求單點的值 int _getSum(int x){ int res = 0, i = x; while(x > 0){ res += i * sum1[i] - sum2[i]; i -= lowbit(x); } return res; } // 求區間的值 int getSum(int x, int y){ return _getSum(y) - _getSum(x - 1); } };