ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

树状数组的基本操作

2022-03-19 15:02:14  阅读:191  来源: 互联网

标签:树状 int lowbit 号位 修改 数组 基本操作


我们想要快速求数组中下标为 x ~ y 的数的和,大家第一时间都会想到用前缀和,时间复杂度为O(1)

但如果说要在线对数组进行修改的话,那用修改前缀和数组就会用O(n)的复杂度,对于q次询问,时间复杂度为O(qn),速度极不理想

这是我们就可以使用树状数组来维护

树状数组支持单点修改,单点查询,区间修改,区间查询等操作

首先我们要知道:

树状数组有一个很关键的东西,叫做lowbit,

lowbit是将一个二进制数的所有高位一都去掉,只留下最低位的1,

比如lowbit(5)=lowbit(0101(二进制))=0001(二进制)

我们看看树状数组对应的位置及其lowbit

我们会发现,树状数组上的8号位(1000),它的lowbit值为8(1000),管辖着A[ 1 ~ 8 ]的节点

而树状数组上的6号位(0110),它的lowbit值为2(0010),管辖着A[ 5 ~ 6 ]的节点

树状数组上的3号位(0011),它的lowbit值为1(0001),管辖着A[ 3 ~ 3 ]的节点

......

可以猜想,树状数组上的k号位,它的lowbit值为lowbit(k),将会管辖着A[ k-lowbit(k)+1 ~ k ]的节点

所以说,要实现求 1 ~ k 的和,我们可以变为计算A[1 ~ k - lowbit(k) ]与A[ k - lowbit(k) + 1 ~ k]的和

而求A[1 ~ k - lowbit(k) ]的和也是如此,递归下去就可以得到结果

时间复杂度为O(logn)

那如何进行单点修改呢?

我们若对A2进行修改,如图,树状数组中2(0010),4(0100),8(1000)号位都会被修改

若对A5进行修改,如图,会对5(0101),6(0110),8(1000)号位造成影响

 我们发现,当k号位被修改时,k + lowbit(k) 号位也会被修改,如此递归,到不能修改为止

时间复杂度为O(logn)

所以,对于q次询问,树状数组的时间复杂度只用O(qlogn)

说了那么多,那lowbit该如何实现呢?

这是,前人的智慧就凸显出来了:

lowbit(x)= x & (-x)

 上代码:

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

#include<bits/stdc++.h>
using namespace std;
const int maxn=5*1e5+5;
int n,m,q,x,y;
struct node{
	node(){
		memset(a,0,sizeof a);
	}
	int a[maxn];
	int sum(int x){
		int ans=0;
		for(;x;x-=x&(-x))ans+=a[x];
		return ans;
	}
	void update(int x,int c){
		for(;x<=n;x+=x&(-x))a[x]+=c;
	}
}T; 
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>x;
		T.update(i,x);
	}
	while(m--){
		cin>>q>>x>>y;
		if(q==1)T.update(x,y);
		else cout<<T.sum(y)-T.sum(x-1)<<endl;
	}
	return 0;
}

标签:树状,int,lowbit,号位,修改,数组,基本操作
来源: https://blog.csdn.net/tanjianlang/article/details/123589954

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有