zoukankan      html  css  js  c++  java
  • 树状数组

     单点修改&区间查询

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #define maxn 500010
    using namespace std;
    template<typename T>
    inline void read(T &x){
        x=0; bool flag=0; char c=getchar();
        for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
        for(;isdigit(c);c=getchar()) x=x*10+(c^48);
        if(flag) x=-x;
    }
    
    int n,m,num,x,y,k;
    int a[maxn],b[maxn];
    
    void add(int x,int y){
        for(;x<=n;x+=x&-x) b[x]+=y;
    }
    
    int ask(int x){
        int ans=0;
        for(;x;x-=x&-x) ans+=b[x];
        return ans;
    }
    
    int main(){
        read(n),read(m);
        for(int i=1;i<=n;i++){
            read(a[i]);
            add(i,a[i]);
        }
        for(int i=1;i<=m;i++){
            read(num);
            if(num==1){
                read(x),read(k);
                add(x,k);
            }
            if(num==2){
                read(x),read(y);
                cout<<ask(y)-ask(x-1)<<endl;
            }
        }
        return 0;
    }

    区间修改&单点查询

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #define maxn 500010
    using namespace std;
    template<typename T>
    inline void read(T &x){
        x=0; bool flag=0; char c=getchar();
        for(;!isdigit(c);c=getchar()) if(c=='-') flag=1;
        for(;isdigit(c);c=getchar()) x=x*10+(c^48);
        if(flag) x=-x;
    }
    
    int n,m,num,x,y,k,temp=0;
    int a[maxn],b[maxn]; 
    
    void add(int x,int y){
        for(;x<=n;x+=x&-x) b[x]+=y;//lowbit
    }
    
    int ask(int x){
        int ans=0;
        for(;x;x-=x&-x) ans+=b[x];//lowbit 
        return ans;
    }
    
    int main(){
        read(n),read(m);
        for(int i=1;i<=n;i++) {
            read(a[i]);
            add(i,a[i]-temp);
            temp=a[i];
        }
        for(int i=1;i<=m;i++){
            read(num);
            if(num==1){
                read(x),read(y),read(k);
                add(x,k);//差分思想 
                add(y+1,-k);//对区间[x,y]修改,只要修改b[x]和b[y+1]即可 
            }
            if(num==2){
                read(x);
                cout<<ask(x)<<endl;
            }
        }
        return 0;
    } 
  • 相关阅读:
    Perface(TCP/IP 协议族)
    CHAPTER 2 Database Environment
    Chapter 1 Introduction
    2. Instructions: Language of the computer (指令:计算机语言)
    sed命令
    磁盘配额
    外设,镜像
    磁盘及文件系统挂载
    网络客户端工具命令
    TCP协议
  • 原文地址:https://www.cnblogs.com/DReamLion/p/14402908.html
Copyright © 2011-2022 走看看