使用线段树预处理。能够使得查询RMQ时间效率在O(lgn)。

线段树是记录某范围内的最小值。

标准的线段树应用。

Geeks上仅仅有两道线段树的题目了。并且没有讲到pushUp和pushDown操作。仅仅是线段树的入门了。

參考:http://www.geeksforgeeks.org/segment-tree-set-1-range-minimum-query/

我改动了一下他的程序,使用pushUp操作。事实上也是非常easy的一个小函数。并且手动计算了下,认为他的动态分配内存,计算须要的树的大小,这样做好像也省不了多少内存。

只是方法不错。能够学习下。

#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <limits.h> inline int LC(int rt) { return rt<<1; }
inline int RC(int rt) { return rt<<1|1; }
inline int minV(int x, int y) { return x < y ? x : y; } inline void pushUp(int *segTree, int rt)
{
segTree[rt] = minV(segTree[LC(rt)], segTree[RC(rt)]);
} int RMQUtil(int *segTree, int qs, int qe, int l, int r, int rt)
{
if (qs <= l && r <= qe)
return segTree[rt];
int res = INT_MAX;
int m = l + ((r-l)>>1); //写错没提示:l + ((r-l)>1)
if (qs <= m) res = RMQUtil(segTree, qs, qe, l, m, LC(rt));
if (m < qe) res = minV(RMQUtil(segTree, qs, qe, m+1, r, RC(rt)), res);
return res;
} int RMQ(int *segTree, int n, int qs, int qe)
{
// Check for erroneous input values
if (qs < 1 || qe > n || qs > qe)
{
puts("Invalid Input");
return -1;
}
return RMQUtil(segTree, qs, qe, 1, n, 1);
} void constructSTUtil(int arr[], int l, int r, int *segTree, int rt)
{
if (l == r)
{
segTree[rt] = arr[l];
return ;
}
int m = l + ((r-l)>>1);
constructSTUtil(arr, l, m, segTree, LC(rt));
constructSTUtil(arr, m+1, r, segTree, RC(rt));
pushUp(segTree, rt);
} int *constructST(int arr[], int n)
{
int h = (int)(ceil(log((double)n)/log((double)2))) + 1;
int treeSize = (1 << h);//1024须要开2048数组。 比一般开3倍或者4被数组省不了太多内存,由于1025就须要开4倍了,一般开3被能够。开4倍就肯定不会超内存了
int *segTree = (int *) malloc(treeSize * sizeof(int));
constructSTUtil(arr, 1, n, segTree, 1); //从1開始构建
return segTree;
} int main()
{
int arr[] = {0, 1, 3, 2, 7, 9, 11};//0位置不使用
int n = sizeof(arr)/sizeof(arr[0]); // Build segment tree from given array
int *st = constructST(arr, n); int qs = 2; // Starting from 1
int qe = 6; // Print minimum value in arr[qs..qe]
printf("Minimum of values in range [%d, %d] is = %d\n",
qs, qe, RMQ(st, n, qs, qe)); free(st);
return 0;
}

Geeks - Range Minimum Query RMQ范围最小值查询的更多相关文章

  1. AOJ DSL_2_A Range Minimum Query (RMQ)

    Range Minimum Query (RMQ) Write a program which manipulates a sequence A = {a0,a1,...,an−1} with the ...

  2. Range Minimum Query and Lowest Common Ancestor

    作者:danielp 出处:http://community.topcoder.com/tc?module=Static&d1=tutorials&d2=lowestCommonAnc ...

  3. RMQ(Range Minimum Query)问题(转)

    问题描述 RMQ问题是求给定区间中的最值问题.对于长度为n的数列A,回答若干查询RMQ(A, i, j).返回数组A中下标在[i,j]里的最小值的下标. 比如数列 5,8,1,3,6,4,9,5,7 ...

  4. Segment Tree Range Minimum Query.

    int rangeMinQuery(int segTree[], int qlow, int qhigh, int low, int high, int pos) { if (qlow <= l ...

  5. RMQ (Range Minimal Query) 问题 ,稀疏表 ST

    RMQ ( 范围最小值查询 ) 问题是一种动态查询问题,它不需要修改元素,但要及时回答出数组 A 在区间 [l, r] 中最小的元素值. RMQ(Range Minimum/Maximum Query ...

  6. [LeetCode] Range Sum Query 2D - Mutable 二维区域和检索 - 可变

    Given a 2D matrix matrix, find the sum of the elements inside the rectangle defined by its upper lef ...

  7. RMQ 区间最大值 最小值查询

    /*RMQ 更新最小值操作 By:draymonder*/ #include <iostream> #include <cstdio> using namespace std; ...

  8. [LeetCode] Range Sum Query - Mutable 区域和检索 - 可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  9. [LeetCode] 307. Range Sum Query - Mutable 区域和检索 - 可变

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

随机推荐

  1. day63-webservice 08.在web项目中配置带有接口的webservice服务

    这个是配置带有接口的WebService的服务. http://localhost:8080/cxf-web-server/service 带有接口的实现类也给它做好了.jaxws:endpoint是 ...

  2. 二、SQL系列之~常见51道SQL查询语句

    [写在前面~~] [PS1:建议SQL初学者一定要自己先做一遍题目,这样才有效果~~(做题时为验证查询结果是否正确,可更改表中数据)] [PS2:文末最后一条代码整合了全部51道题目及答案~~] [P ...

  3. 45.Qt openGL实现三维绘图

    main.cpp #include <QApplication> #include <iostream> #include "tetraheadron.h" ...

  4. POJ 3620 DFS

    题意: 给你n*m的矩形,有k个坏点 问最大坏点连通块的坏点数. 一发水题.. 裸的DFS // by SiriusRen #include <cstdio> #include <a ...

  5. king枚举帮助类

    可以方便的实现枚举 枚举 public enum DeptType { [Description("科室1")] Professional = , [Description(&qu ...

  6. 备忘录模式(Memento)C++实现

    备忘录模式 意图: 在不破坏封装性的前提下,捕获一个对象的内部状态,并在该对象之外保存这个状态.这样以后就可将改对象恢复到原先保存的状态. 适用性: 1.必须保存一个对象在某一个时刻的部分状态,这样以 ...

  7. 服务器控件使用eval()绑定属性出现服务器标记的格式不正确

    在使用asp.net服务器端控件的时候,想要动态绑定控件某属性的值,或者动态绑定控件事件方法的参数,例如一个<asp:RadioButton ID="RadioButton5" ...

  8. Java中的自动转换

    特点: 1. 系统自动完成的,不需要程序员手动修改代码 2.将 取值范围小的类型 自动提升为 取值范围大的类型 注意: 整数类型直接写会默认为int  小数类型直接写默认为double 类型的范围大小 ...

  9. Spring cloud公共模块

    1.0公共的模块是公共的工具包以及实体等 2.添加架包 <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xs ...

  10. ubuntu18.0安装redis

    ubuntu版本:Ubuntu-Server 10.04.1 LTS redis版本:4.0.9 安装 使用apt安装 sudo apt-get update sudo apt-get install ...