树状数组。
原数组为a[n],树状为s[n].主要用于区间的查找与增删除,复杂度为logn。
c[1]=a[1]
c[2]=a[1]+a[2]~转换二进制10
c[3]=a[3]
c[4]=a[1]+a[2]+a[3]+a[4]~转换二进制100
c的下标转换为2进制,后面有几个0就代表其包含了从其开始前面有多少个数。
#include <iostream>
#include <stdio.h>
#include <string.h>
using namespace std;
int c[50000],n;
int lowbits(int x){
return x&(-x); //这里是返回2^(x的后面的零的个数)
}
void add(int x,int y){
while(x<=n){
c[x]+=y;
x+=lowbits(x);
} //相加的时候是从前面开始向后加
}
int sum(int x){
int s=0;
while(x>0){
s+=c[x];
x-=lowbits(x);
}
return s;
}
int main(){
//freopen("in.txt","r",stdin);
memset(c,0,sizeof(c));
int i,j,k,l,f1,f2,f3,t1,t2,t3,m;
cin >> n; //n为这个数组的长度
add(2,5);
add(3,14);
cout << sum(2) << endl;
}