#define lowbit(i) (-i & i) // 二进制数字最低位'1'和其后'0'组成的数字
template<typename T>
class BinaryIndexedTree {
public:
BinaryIndexedTree(const vector<T>& arr) :LEN(arr.size()) {
ori = arr;
ori.insert(ori.begin(), INT_MAX);
BuildBIT(arr);
}
/*
* 构建树状数组,index 从1开始, 输入数组index 从 0 开始,利用update 操作完成
*/
void BuildBIT(const vector<T> &arr) {
idx.resize(LEN + 1, INT_MAX);
for (int i = 1; i <= LEN; ++i) {
idx[i] = arr[i - 1];
for (int j = i - 1; j > i - lowbit(i); j -= lowbit(j)) {
idx[i] = min(idx[i], idx[j]);
}
/* 另外一种写法
* for(int j=1;j<lowbit(i); j<<=1){
* idx[i]=min(idx[i],idx[i-j]);
* }
*/
}
}
int Query(int start, int end) {
int ret = ori[end];
start++; // 索引重映射
end++;
while (end >= start) {// idx[end]覆盖的左边界小于等于start点
if (start <=
树状数组求区间最值
最新推荐文章于 2024-07-08 19:55:37 发布
本文介绍了一种使用树状数组(Binary Indexed Tree)实现区间最值查询和修改的方法。通过lowbit运算确定更新和查询路径,提供Query和modify两个函数,分别用于查询区间最小值和修改指定位置的值。树状数组在常数时间内完成更新,并能高效地进行区间查询。
摘要由CSDN通过智能技术生成