不同树状数组的实现

  • 单点修改--单点查询
  • #include <bits/stdc++.h>
    using namespace std;   //区间查询,单点修改
    int n,m;
    int arr[500005];
    int c[500005];
    #define lowbit(x) ( (x)& -(x) )
    void update(int x,int t){   //更新
        for(int i=x;i<=n;i+=lowbit(i)){
            c[i]+=t;
        }
    }
    int query(int x){     //查询
        int ans=0;
        for(int i=x;i;i-=lowbit(i)){
            ans+=c[i];
        }
        return ans;
    }
    void solve(){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            cin>>arr[i];
            c[i]+=arr[i];                   //init
            if(i+lowbit(i)<=n){
                c[i+lowbit(i)]+=c[i];
            }
        }
        while(m--){
            int op,x,y;
            cin>>op>>x>>y;
            if(op==1){
                update(x,y);
            }
            else{
                cout<<query(y)-query(x-1)<<"\n";
            }
        }
    }
    
    int main() {
        ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
        solve();
        return 0;
    }
  • 区间修改--单点查询
  • #include <bits/stdc++.h>
    using namespace std;
    #define lowbit(x) (x)&-(x)
    int n,m;
    int c[500005];
    void update(int x,int t){
        for(int i=x;i<=n;i+= lowbit(i)){
            c[i]+=t;
        }
    }
    
    int query(int x){
        int sum=0;
        for(int i=x;i;i-= lowbit(i)){
            sum+=c[i];
        }
        return sum;
    }
    
    void solve(){
        cin>>n>>m;
        int arr[500005]={0};
        for(int i=1;i<=n;i++){
            cin>>arr[i];
        }
        while(m--){
            int op;
            cin>>op;
            if(op==1){
                int x,y,k;
                cin>>x>>y>>k;
                update(x,k);
                update(y+1,-k);
            }
            else{
                int x;
                cin>>x;
                cout<<arr[x]+query(x)<<"\n";
            }
        }
    }
    
    int main() {
        ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
        solve();
        return 0;
    }
  • 区间修改--区间查询
  • #include <bits/stdc++.h>
    using namespace std;
    #define lowbit(x) (x) & -(x)     //区间修改,区间查询
    #define int long long
    const int N=100005;
    int n,m,arr[N],presum[N],c0[N],c1[N];
    
    void update(int c[],int x,int t){
        for(int i=x;i<=n;i+= lowbit(i)){
            c[i]+=t;
        }
    }
    
    int query(int c[],int x){
        int ret=0;
        for(int i=x;i;i-= lowbit(i)){
            ret+=c[i];
        }
        return ret;
    }
    
    void solve(){
        cin>>n>>m;
        for(int i=1;i<=n;i++){
            cin>>arr[i];
            presum[i]+=presum[i-1]+arr[i];
        }
        while(m--){
            char op;
            cin>>op;
            if(op=='C'){
                int l,r,d;
                cin>>l>>r>>d;
                update(c0,l,d), update(c0,r+1,-d);
                update(c1,l,l*d), update(c1,r+1,-(r+1)*d);
            }
            else{
                int l,r;            //[1,r]-[1,l-1]
                cin>>l>>r;
                int ans=( presum[r]+ (r+1)*query(c0,r)- query(c1,r) )-
                        ( presum[l-1]+(l-1+1)*query(c0,l-1)- query(c1,l-1) );
                cout<<ans<<"\n";
            }
        }
    }
    
    signed main() {
        solve();
        return 0;
    }

     

posted @ 2023-12-01 13:04  osir  阅读(0)  评论(0编辑  收藏  举报