使用线段树预处理。能够使得查询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. [JXOI 2018] 守卫 解题报告 (DP)

    interlinkage: https://www.luogu.org/problemnew/show/P4563 description: solution: 注意到对于范围$[l,r]$,$r$这 ...

  2. python学习-字符串 列表 元祖

    目录 Python翻转字符串(reverse string) 简单的步长为-1, 即字符串的翻转(常用) 递归反转 借用列表,使用reverse()方法 字符串常用操作 index split 切片 ...

  3. 全局变量变为局部变量 & MVC思想

    1 函数中的全局变量如何变成局部变量? 全局变量之间会相互骚扰.所以在代码中不要用全局变量.ES6之前只有函数里面有全局变量. 全局变成局部变量怎么变? 把代-放在一个函数如中,再.call()执行一 ...

  4. GoogleMap 获取自己的数字证书API key的步骤

    http://dreamylights.blog.51cto.com/1163218/1360759 1. 进入到Google APIs Console页面 https://code.google.c ...

  5. ubuntu下安装 nginx + php + memcached + mariadb

    一,apt-get 安装 1,安装nginx sudo apt-get install nginx 所有的配置文件都在/etc/nginx下,虚拟主机配置在/etc/nginx/sites-avail ...

  6. Windows上部署Python

    以Python 3.5为例 1.到https://www.python.org/downloads/windows/下载embeddable zip file类型的压缩包python-3.5.1-em ...

  7. 项目随笔之springmvc中freemark如何获取项目路径

    转载:http://blog.csdn.net/whatlookingfor/article/details/51538995 在SpringMVC框架中使用Freemarker试图时,要获取根路径的 ...

  8. (转) RabbitMQ学习之helloword(java)

    http://blog.csdn.net/zhu_tianwei/article/details/40835555 amqp-client:http://www.rabbitmq.com/java-c ...

  9. Swift - 反射(Reflection)的介绍与使用样例(附KVC介绍)

    1,反射(Reflection) 对于C#.Java开发人员来说,肯定都对反射这个概念相当熟悉.所谓反射就是可以动态获取类型.成员信息,同时在运行时(而非编译时)可以动态调用任意方法.属性等行为的特性 ...

  10. <轉>APUE:mmap函数

    起初 看过一遍内存映射I/O,意思大概是懂了,就是直接操作文件再而直接通过缓冲区来操作,减少一些read.write调用所花费的时间.加上文中给出一个copy的例子,意思也好理解的.不过困扰的来了,我 ...