单点更新、区间求和模板模板
模板:
int n;int a[10005],c[10005]intlowbit(int x){return x&(-x);}voidupdata(int i,int k){while(i <= n){
c[i]+= k;
i +=lowbit(i);}}intgetsum(int i){int res =0;while(i >0){
res += c[i];
i -=lowbit(i);}return res;}
区间更新、单点查询模板
int n,m;int a[50005]={0},c[50005];//对应原数组和树状数组intlowbit(int x){return x&(-x);}voidupdata(int i,int k){//在i位置加上kwhile(i <= n){
c[i]+= k;
i +=lowbit(i);}}intgetsum(int i){//求D[1 - i]的和,即A[i]值int res =0;while(i >0){
res += c[i];
i -=lowbit(i);}return res;}intmain(){scanf("%d",&n);for(int i =1; i <= n; i++){scanf("%d",&a[i]);updata(i,a[i]- a[i-1]);//输入初值的时候,也相当于更新了值}//[x,y]区间内加上kupdata(x,k);//A[x] - A[x-1]增加kupdata(y+1,-k);//A[y+1] - A[y]减少k//查询i位置的值int sum =getsum(i);return0;}
区间更新、区间查询模板
int n,m;int a[50005]={0};int sum1[50005];//(D[1] + D[2] + ... + D[n])int sum2[50005];//(1*D[1] + 2*D[2] + ... + n*D[n])intlowbit(int x){return x&(-x);}voidupdata(int i,int k){int x = i;//因为x不变,所以得先保存i值while(i <= n){
sum1[i]+= k;
sum2[i]+= k*(x-1);
i +=lowbit(i);}}intgetsum(int i){//求前缀和int res =0,x=i;while(i >0){
res += x*sum1[i]-sum2[i];
i -=lowbit(i);}return res;}intmain(){scanf("%d",&n);for(int i =1;i <= n;++i){scanf("%lld",&a[i]);updata(i,a[i]-a[i-1]);}//[x,y]区间内加上kupdata(x,k);//A[x] - A[x-1]增加kupdata(y+1,-k);//A[y+1] - A[y]减少k//求[x,y]区间和int sum =getsum(y)-getsum(x-1);return0;}