1. 改点求段(单点更新, 区间求和)
代码:
1 #include <iostream> 2 using namespace std; 3 4 const int MAXN = 1e5 + 10; 5 int tree[MAXN], n; 6 7 int lowbit(int x){//返回 pow(2, k),其中k为末尾0的个数, 即返回最低位1的值 8 return x & -x; 9 } 10 11 void add(int x, int d){//将d累加到tree数组对应位置 12 while(x <= n){ 13 tree[x] += d; 14 x += lowbit(x); 15 } 16 } 17 18 int sum(int x){//向上求和, 返回[1, x]所有元素的和 19 int ans = 0; 20 while(x > 0){ 21 ans += tree[x]; 22 x -= lowbit(x); 23 } 24 return ans; 25 } 26 27 int main(void){ 28 int x; 29 cin >> n; 30 for(int i = 1; i <= n; i++){ 31 cin >> x; 32 add(i, x); 33 } 34 for(int i = 1; i <= n; i++){ 35 cout << sum(i) << endl; 36 } 37 return 0; 38 }