树状数组维护区间最值
作者:互联网
\(updata : 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<low;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 数组的一个区间 , 参考 8 的例子.
}
}
标签:树状,int,数组,区间,维护,最值 来源: https://www.cnblogs.com/xqy2003/p/15859176.html