讲这个的博文已经不少了,但感觉不够详细不够通俗易懂,所以我尝试着更详细更通俗易懂的说一下我的理解。
这个算法只支持单点修改和区间查询最值。每一次维护和查询的时间复杂度都是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 (