树状数组维护区间最值


\(update : 2022.2.1\)
学习


没错 , 树状数组也能维护区间最值.(单点修改 , 区间查询)

不过这种写法要对树状数组维护的区间要有一定的理解.

主要是理解 tree[x] 维护的区间 [x - lowbit(x) , x] 的最值

单点修改

//将 a[x] 修改为 y.
void updata(int x,int y){
	tree[x] = a[x] = y ; // 这里我的思考与原作有冲突.
	while( x<= n){
		//tree[x] = y ; 原作在这里加上了更新.
		int low = lowbit(x);
		for(i=1;i>=1? , 去观察树状数组维护的区间[x-lowbit(x),x] , 都是跟 x 差 2 的次方倍 ; 注意 < 的细节 , 举例 8  (i = 1 , 2, 4 ) , 若 <= 则有 i = 8 , tree[0] 的加入.
		tree[x] = max(tree[x] , tree[x - i]); // 注意是tree数组 , 有是定义域上的一点代表 a 数组的一个区间 , 用 lowbit , 往回推一定可以能覆盖到一开始 a[x] 修改为 y 的影响.
	}
}

区间查询

int ask(int x,int y){
	int ans = 0;
	while( y>=x ){
		ans = max(ans , a[y]) , y -= 1; //这里为什么要这样做?我要去除我这一点,在找我的子区间;
		for(;y-lowbit(y)>=x;)//我维护的子区间大于x , 我这个 x 才有用.
			ans = max(ans , tree[y]);
			y -= lowbit(y);
	}
	//等价于for(;y-lowbit(y)>=x;y-lowbit(y)) //判断->执行->减->判断....
	return ans;
}