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 }
View Code

相关文章: