树状数组基本操作

本文详细介绍了数状数组的基本概念、操作函数及其应用。包括如何通过low_bit函数界定树状数组的范围,如何使用sum函数求解区间和,以及如何通过add函数更新区间上的值。同时,还讨论了两种不同的操作情况:一种是修改区间内的单点并求解区间和,另一种是修改区间并求解特定点的值。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 今天刚刚接触数壮数组,大概的原理是理解了,不过理解的不是很透彻,也就是知其然,不知其所以然.所以把数状数组的基本操作暂时先记录下来.等以后理解透彻之后在进一步的总结整理.

分两中情况讨论:

一.每次修改的是区间上的某个点,所求的是关于某个区间.

第一个函数:

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

这个函数主要是界定树状数组(暂且这么以为吧)的范围;

例如:

由函数可知 C1=A1;

                      C2=C1+A2=A1+A2;

                      C3=C3=A3;

                      C4=C2+C3+A4=A1+A2+A3=A4;

                      C5=A5;

                      .......................

                      C8=C4+C6+C7+A8=A1+A2+A3+A4+A5+A6+A7+A8;

第二个函数:

int sum (int i){
	int ans = 0;
	while (i){
		ans += bit[i];
		i -= i & -i;
	}
	return ans;
i


这个函数是求1,2,3.......i 的区间和.

第三个函数:

void add (int i,int val){
	while (i<=n){
		bit[i] += val;
		i += i & -i;
	}
}


这个函数主要是更新区间上i点的值加上val;

 

二.每次修改的是一个区间,所求的值是关于某个点的.

这种情况和上面的那中情况基本上差不多,只要稍加改动即可;

第二个函数:

int sum (int i){
	int ans = 0;
	while (i<=n){
		ans += bit[i];
		i += low_bit (i);
	}
	return ans;
}


第三个函数:

void add (int i,val){
	while (i){
		bit[i] += val;
		i -= low_bit (i);
	}
}


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值