树状数组

#include <bits/stdc++.h>
using namespace std;
//规定下标从一开始
int a[1000],c[1000],n;
int lowbit(int x){
    return  x&(-x);
}

//获得前n项和的值
int get_sum(int x){
    int s=0;
    while(x>0){
        s+=c[x];
        x=x-lowbit(x);
    }
    return s;
}
//获得区间的值
int get_range_sum(int i,int j){
    return get_sum(j)-get_sum(i)+a[i];
}
//把i位置增加x值
void update(int i,int x){
    a[i]+=x;//别忘了
    while(i<=n){
        c[i]+=x;
        i=i+lowbit(i);
    }
}
//把i位置设置为x值
void set_value(int i,int x){
    int p=i;
    while(i<=n){
        c[i]=c[i]-a[p]+x;
        i=i+lowbit(i);
    }
    a[p]=x;//别忘了
}
int main() {
    cin>>n;
    memset(a,0, sizeof(a));
    memset(c,0, sizeof(c));
    for(int i=1;i<=n;i++){
        //如果cin>>a[i],set_value(i,a[i]);的话,会错误
        int x;
        cin>>x;
//        set_value(i,x);
        update(i,x);
    }
    cout<<get_sum(n)<<endl;
    set_value(1,100);
    cout<<get_range_sum(1,1)<<endl;
    return 0;
}

 

posted @ 2020-03-04 21:32  西伯利亚挖土豆  阅读(112)  评论(0编辑  收藏  举报