树状数组

树状数组一种可以快速区间操作的算法,与差分不同的是,树状数组在线,和线段树一样,而差分则是离线。下面我就来讲一讲。

1.简介

树状数组一共有3个步骤,分别是:lowbit、增加结点数值、查询,并且附有main函数。

2.代码

1.lowbit

int lowbit(int x){
	return x & -x;
}

2.增加结点数值

int n, tree[100005];//n和树状数组

void add(int x, int v){//x为增加数值的结点编号,v为增加的数值
	while (x <= n){
    	t[x] += v;
        x += lowbit(x);
	}
}

3.查询

int check(int x){
	int sum = 0;
    
    while (0 < x){
    	sum += t[x];
        x -= lowbit(x);
    }
    
    return sum;
}

附.main

int main(){
	int n, m;
    
    cin >> n >> m;
    
    for (int i = 1; i <= n; i++){
    	int x;
        
        cin >> x;
        
        add(i, x);
    }
    
    for (int i = 1; i <= n; i++){
    	int x, y;
        string s;
        
        cin >> s >> x >> y;
        
        if ("add" == s) add(x, y);//增加
        else cout << check(y) - check(x-1) << endl;//查询
    }
    
    return 0;
}

这就是树状数组的全部了,点个赞呗。欢迎在评论区留言!

c++算法大全 文章被收录于专栏

本专栏收集了c++大部分基础算法,附有简介和代码。

全部评论
上新一下线段树呗!
2 回复 分享
发布于 08-27 16:02 北京

相关推荐

评论
3
4
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务