数组C存数据
Ck的含义是某个区间和【K-lowbit(k), k】
lowbit(k)是k的二进制的第一个1
如(10)1010的第一个1是2
#include<iostream>
#include<cstring>
#include<cstdio>
#include<algorithm>
using namespace std;
int lowbit(int n){
return n-(n&(n-1));
}
/*
*原始数组的i位置增加v后, 更新c数组 n是边界
*/
void updata(int n, int i, int v, int c[]){
for(int k = i; k <= n; k += lowbit(k)){
c[k] += v;
}
}
int getSum(int c[], int i){
int sum = 0;
for(int k = i; k >= 1; k -= lowbit(k)){ //k往前移动
sum += c[k];
}
return sum;
}
int main(){
int arr[] = {1,2,3,4,5,6,7,8};
int c[9];
memset(c, 0, sizeof(c));
for(int i = 0; i < 8; i++){
updata(9, i + 1, arr[i], c);
}
cout << getSum(c, 7) - getSum(c,4) << endl;
return 0;
}