树状数组
采用lowbit();//返回二进制的第一个1的位置的大小 如 lowbit(110)==10==2; 它代表第6个位置是保存原数组该位置前1个的和+本身
代码实现
#include<iostream> #include<vector> template<typename T> class Treesum //Treesum 不是数组下标 是第几个 { private: std::vector<T> bit; int lowbit(int x) { return x & (-x); } public: Treesum(std::vector<T>& val,int n):bit(n + 1, 0) { int i,j; n = val.size(); for (i = 0; i < n; i += 1) { for (j = i+1; j <= n; j += lowbit(j)) { bit[j] += val[i]; } } } Treesum(T *val, int n) :bit(n + 1, 0) { int i, j; for (i = 0; i < n; i += 1) { for (j = i+1; j <= n; j += lowbit(j)) { bit[j] += val[i]; } } } Treesum(int n) :bit(n + 1, 0) {} bool update(int index, int delta) //index不是数组下标 是第几个 { int n = bit.size(); if (index<1 || index>n)return false; for (; index <= n; index += lowbit(index)) bit[index] += delta; return true; } T query(int n) //前n项和 { T sum = 0; while (n) { sum += bit[n]; n -= lowbit(n); } return sum; } };