树状数组模板

洛谷 P3374 【模板】树状数组 1
洛谷 P3368 【模板】树状数组 2

单点修改和区间查询

洛谷 P3374 【模板】树状数组 1

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
using namespace std;
int n,m;
int a[1000000],c[1000000];
inline int read(){
    int x=0,w=1;char ch=0;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') w=-1,ch=getchar();
    while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch-48),ch=getchar();
    return x*w;
}
inline void add(int x,int y) { while(x<=n){ c[x]+=y; x+=x&-x; } }
inline int getsum(int x){ int ans=0; while(x) { ans+=c[x]; x-=x&-x; } return ans;}
int main(){
    n=read();m=read();
    for(register int i=1;i<=n;++i) a[i]=read(),add(i,a[i]);
    for(register int i=1;i<=m;++i) {
        int op=read(),x=read(),y=read();
        if(op==1) add(x,y);
        else if(op==2) printf("%d\n",getsum(y)-getsum(x-1));
    }
    return 0;
} 

区间修改和单点查询

洛谷 P3368 【模板】树状数组 2

#include<iostream>
#include<cstdio>
#define maxn 500100
using namespace std;
int n,m,c[maxn],a[maxn];
inline int read(){
    int x=0,w=1;char ch=0;
    while(ch!='-'&&(ch<'0'||ch>'9')) ch=getchar();
    if(ch=='-') w=-1,ch=getchar();
    while(ch>='0'&&ch<='9') x=(x<<3)+(x<<1)+(ch-48),ch=getchar();
    return x*w;
}
inline int add(int x,int k){ for(int i=x;i<=n;i+=i&(-i)) c[i]+=k; }
inline int query(int x) { int sum=0; for(int i=x;i>0;i-=i&(-i)) sum+=c[i]; return sum ;}
int main(){
    n=read();m=read();
    for(int i=1;i<=n;i++)  a[i]=read();
    while(m--){
        int k=read();
        if(k==1){int x=read(),y=read(),z=read();add(x,z); add(y+1,-z);}//维护差分数组
        else{int x;x=read();printf("%d\n",a[x]+query(x));   }//query()求的是改变的值,再加上原来的值就可以了
    }
    return 0;
}

区间修改、区间查询

参见lcf大佬的博客:https://www.cnblogs.com/lcf-2000/p/5866170.html
另外一个大佬博客 https://www.cnblogs.com/RabbitHu/p/BIT.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值