树状数组(模板)

参考博客
题目: P3374 【模板】树状数组 1

lowbit:二进制最低位1的大小,也是其能管辖到的数的范围
树状数组记得开long long 
单次操作的时间复杂度是O(lgn)
只需开N的空间
比线段树的常数小
按值建树( add(a[i],1) ):ask可以求比当前数小(或大)的数的数量
按位置建树( add(pos,1) ):ask可以求当前点左(或右)边的点数
树状数组:求前面或后面有多少个数
         求某区间特定性质点的数量
可用于单点修改,区间查询
      区间修改,单点查询等等

//

#include<bits/stdc++.h>
using namespace std;
#define low(x) x&(-x)
#define ll long long 
int const N=5e5+7;
int n,m;
ll a[N];   //tr[N]  //树状数组
void add(int pos,int val){  //维护其前缀和的操作
    for(;pos<=n;pos+=low(pos)){   //记住就好
        a[pos]+=val;
    }
}
ll ask(int x){  //查询x的前缀和
    ll z=0;
    for(;x;x-=low(x)){  //记住就好
        z+=a[x];
    }
    return z;
}
int main(){
    cin >> n >> m;
    for(int i=1;i<=n;++i){
        int b;
        cin >> b;
        add(i,b);
    }
    while(m--){
        int b,c,d;
        cin >> b >> c >> d;
        if(b==1) add(c,d);
        else cout << ask(d)-ask(c-1) << endl;
    }
    return 0;
} 
全部评论

相关推荐

02-25 23:53
门头沟学院 Java
神哥不得了:神哥来啦~自我评价和校园经历的话可以直接删了,从大厂暑期的话应该没有什么太多问题,应该是能拿到很多大厂面试机会的,就是在面试的时候表示的好一点就行,可以在面试前先把高频top 50的八股多巩固几遍,千万不要看那些假高频八股,这两个项目的话问题不是很大,应该能够帮你找到大厂实习的,算法的话一定要刷起来,因为大厂有些还是比较看重算法的
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客企业服务