RMQ段树中的错误
Bug in RMQ Segment Tree
我正在尝试构建用于执行RMQ的细分树。不知何故,无论我查询哪个范围,它都会返回我0。
例如,我的数组是[ 1,2,3,4,5,6,7,8,9,10 ]
。RMQ从索引3到5应该给出4。但是我的代码不断输出0。
我的代码:
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll N, st[2*100000], arr[100000];
void build(int r, int lo,int hi) {
if(lo==hi) {
st[r] = arr[lo];
} else {
build(r<<1,lo,(lo+hi)>>1);
build((r<<1)|1,((lo+hi)>>1)+1,hi);
st[r] = min(st[r<<1],st[(r<<1)|1]);
}
}
void update(int r,int lo,int hi,ll val,int i) {
if(lo==hi) {
st[r] = val;
} else {
int mid = (lo+hi)>>1;
if(lo <= i && i <= mid) {
update(r<<1,lo,mid,val,i);
} else {
update((r<<1)|1,mid+1,hi,val,i);
}
st[r] = min(st[r<<1],st[(r<<1)|1]);
}
}
ll query(int r,int lo,int hi,int a,int b) {
if(lo > b || hi < a) {
return LLONG_MAX;
} else if(lo <= a && hi >= b) {
return st[r];
} else {
int mid = (lo+hi)>>1;
return st[r] = min(query(r<<1,lo,mid,a,mid),query((r<<1)|1,mid+1,hi,mid+1,b));
}
}
int main(void) {
for(int i = 0; i <= 10; i++) arr[i] = i;
build(1,0,10);
cout << query(1,0,10,3,5) << endl;
return 0;
}
编辑:
感谢您的所有帮助。就像下面提到的答案一样,我的查询范围是错误的。除此之外,还有2个错误:
if(lo <= a && hi >= b)
应该是 (a <= lo && b >= hi)
和
return st[r] = min(query(r<<1,lo,mid,a,mid),query((r<<1)|1,mid+1,hi,mid+1,b));
应该是
return min(query(r<<1,lo,mid,a,mid),query((r<<1)|1,mid+1,hi,mid+1,b));
因为我只是在进行查询,不应修改树。
这条代码线:
return st[r] = min(query(r<<1,lo,mid,a,mid),query((r<<1)|1,mid+1,hi,mid+1,b));
为什么您要在每个递归调用中更改a
和b
。应该是
return st[r] = min(query(r<<1,lo,mid,a,b),query((r<<1)|1,mid+1,hi,a,b));
,您的更新功能是错误的:
在此处检查
相关文章:
- 我是如何在这段代码中出现分段错误的
- 在二叉搜索树中插入时出现分段错误
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 如何修复 cpp 中的"undefined reference to"错误,当调用刚性车身树中的函数时,如 doKinematics、CreateKinematicCache
- 如何从提升属性树中读取字段类型
- C++:段树中的运行时错误
- RMQ段树中的错误
- 为什么这段代码没有在二叉搜索树中插入节点
- 尝试在二进制树中赋值时出现分段错误
- 正在段树中查询
- 用于C++中的段树的STL
- 如何修复二进制搜索树中的逻辑错误
- 为什么我在这段代码中出现分段错误.
- 如何使用段树计算数组中的反转次数
- 堆树中出现编译错误
- 在这段代码中查找3个错误,这些错误都会导致无限循环
- 从二叉树中删除错误
- 段树实现中的问题
- 寻找最大使用段树给出错误的结果
- 内存分配错误-段树