树状数组求区间最大值

讲这个的博文已经不少了,但感觉不够详细不够通俗易懂,所以我尝试着更详细更通俗易懂的说一下我的理解。

 

这个算法只支持单点修改和区间查询最值。每一次维护和查询的时间复杂度都是O((logn)^2),但这是满打满算的时间复杂度。

假设是要维护和查询区间的最大值(最小值将max改成min 就好了)

这个算法和树状数组维护和查询区间和的方法很相似:

 

一、数组的含义

1、在维护和查询区间和的算法中,h[x]中储存的是[x,x-lowbit(x)+1]中每个数的和,

 

2、在求区间最值的算法中,h[x]储存的是[x,x-lowbit(x)+1]中没个数的最大值。

求区间最值的算法中还有一个a[i]数组,表示第i个数是多少。

(其中lowbit(x) = x & (-x) 这个学过树状数组的应该都知道吧。。。。。)

 

二、单点修改后的更新

1、在维护区间和的算法中,是这样维护单点修改的

void updata(int i, int val)
{
	while (i <= n)
	{
		h[i] += val;
		i += lowbit(i);
	}
}


 

2、在来看维护区间最大值的算法,我们先看一整段区间[1,n]都需要初始化的情况。(即 h[] 数组都为0,现在需要用 a[] 数组更新 h[] 数组)

void updata(int i, int val)
{
	while (
评论 20
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值