范围最小查询
Range minimum Query
这是rmq使用段树。但是我没有得到正确的输出,谁能告诉我我错在哪里。
'
#include<iostream>
#include<cmath>
#define inf 1e9
using namespace std;
int get_mid(int a,int b){
return a+(b-a)/2;
}
int min(int a,int b){
int temp=(a<b)?a:b;
return temp;
}
int get_min_util(int str[],int beg,int end,int l,int r,int i){
if(l<=beg && r>=end)
return str[i];
if(l>end || r<beg){
return 0; ////////c1
}
int mid=get_mid(beg,end);
return (get_min_util(str,beg,mid,l,r,2*i+1),get_min_util(str,mid+1,end,l,r,2*i+2));
}
int get_min(int str[],int len,int l,int r){
if(l<0 || r>len-1 || l>r){
return 0;
}
else
return get_min_util(str,0,len-1,l,r,0);
}
int build_rmq_arr_util(int str[],int beg,int end,int big_arr[],int i){
if(beg==end){
big_arr[i]=str[beg];
return big_arr[i];
}
int mid=get_mid(beg,end);
big_arr[i]=min(build_rmq_arr_util(str,beg,mid,big_arr,2*i+1),build_rmq_arr_util(str,mid+1,end,big_arr,2*i+2));
return big_arr[i];
}
int*bulid_rmq_arr(int str[],int len){
int temp=ceil(log2(len));
temp=2*pow(2,temp)-1;
int *big_arr=new int[temp];
build_rmq_arr_util(str,0,len-1,big_arr,0);
return big_arr;
}
void pop(int arr[],int size){
for(int i=0;i<size;i++){
cout<<arr[i]<<" ";
}
cout<<endl;
}
int main(){
int str[]={1,2,3,4,5,6};
int len=sizeof(str)/sizeof(int);
int *rmq_arr;
rmq_arr=bulid_rmq_arr(str,len);
//pop(rmq_arr,3*len);
cout<<get_min(rmq_arr,len,1,2);
}
"
这段代码的输出:
0
1-2范围内的预期输出为2
问题是在get_min_util()。当不在值域内时,它应该返回无穷大。你还必须返回左子和右子的最小值。
int get_min_util(int str[],int beg,int end,int l,int r,int i){
if(l<=beg && r>=end)
return str[i];
if(l>end || r<beg){
return inf; ////////c1
}
int mid=get_mid(beg,end);
return min(get_min_util(str,beg,mid,l,r,2*i+1),get_min_util(str,mid+1,end,l,r,2*i+2));
}
相关文章:
- Mongodb c++驱动程序:如何查询元素的数组
- 为什么在全局范围内使用"extern int a"似乎不行?
- 查询SQLite数据库中的日期
- 尝试通过多个向量访问变量时,向量下标超出范围
- 错误:未在此范围内声明'reverse'
- 正在将指针转换为范围
- 使用std::transform将一个范围的元素添加到另一个范围中
- 在 c++ 中解决段树以外的范围查询的有效方法是什么?
- 对于多个查询,查找在 l 到 r 范围内具有相同元素的最长公共子数组
- MongoDB:跨日期范围的查询
- 对树中路径的范围查询
- C++MySql连接器-查询的结果超出范围
- 减少具有未排序时间范围的表中的查询时间
- C++数据结构的时间范围查询
- 如何查询范围中的任何位是否在 C++ std::bitset 中设置
- 使用 Firedac 进行 MongoDB 的时间范围查询
- 数组上的范围最小查询
- mongodbc++查询一天的范围
- c++中任何好的范围查询库(使用K-D树,四叉树或r语言 - 树)
- 范围最小查询