lowbit(x)计算的结果是2^k,其中k为x在二进制表示下末尾0的个数
int lowbit(int x){
return x&(-x)
}
树状数组模板:
#include<stdio.h>
#include<string.h>
int a[10005];
int c[10005];
int n;
int lowbit(int x){
return x&(-x);
}
int getSum(int x){
int ans = 0;
while(x > 0){
ans += c[x];
x -= lowbit(x);
}
return ans;
}
void update(int x, int value){
a[x] += value;
while(x <= n){
c[x] += value;
x += lowbit(x);
}
}
int main(){
while(scanf("%d", &n)!=EOF){
memset(a, 0, sizeof(a));
memset(c, 0, sizeof(c));
for(int i = 1; i <= n; i++){
scanf("%d", &a[i]);
update(i, a[i]);
}
int ans = getSum(n-1);
printf("%d\n", ans);
}
return 0;
}
树状数组(求逆序对)_baby的我的博客-CSDN博客_树状数组求逆序对树状数组 | Perf (wangyuhang-cmd.github.io)