前言:
暂时就简单发个板子,如果后续有时间有精力的话补一下原理和典型题目
代码:
#define N 1e5
int tree[N+1], n;
//二进制最低位1
int lowbit(int x){
return x & -x;
}
//建立
void build(int pos, int num){
for(int i = pos; i <= n; i += lowbit(i)){
tree[i] += num;
}
}
//前缀和查找
int find(int x){
int res = 0;
for(int i = x; i; i -= lowbit(i)){
res += tree[i];
}
return res;
}
测试:
源码:
#include <iostream>
using namespace std;
#define N 100010
int tree[N], n;
//二进制最低位1
int lowbit(int x){
return x & -x;
}
//建立
void build(int pos, int num){
for(int i = pos; i <= n; i += lowbit(i)){
tree[i] += num;
}
}
//前缀和查找
int find(int x){
int res = 0;
for(int i = x; i; i -= lowbit(i)){
res += tree[i];
}
return res;
}
int main(void)
{
cin >>n;
for(int i = 1; i <= n; i++){
int x; cin >>x;
build(i, x);
}
for(int i = 1; i <= n; i++){
cout <<find(i) <<" ";
}
return 0;
}