使用线段树预处理。能够使得查询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. NOIP2011 D1T1 铺地毯

    P1692 铺地毯 时间: 1000ms / 空间: 131072KiB / Java类名: Main 背景 NOIP2011 day1 第一题 描述 为了准备一个独特的颁奖典礼,组织者在会场的一片矩 ...

  2. C#中的值类型、引用类型,代码告诉你他是什么类型。

    C#代码告诉你这是什么类型. using System; using System.Collections.Generic; using System.Linq; using System.Text; ...

  3. 修复wordpress插件编辑器漏洞

    具体方法,将下面的代码添加到您的配置文件 wp-config.php中: define( 'DISALLOW_FILE_EDIT', true ); 以此关闭插件编辑器功能,一切就这么简单,漏洞也就不 ...

  4. Java 实时论坛 - Sym 1.3.0 发布

    简介 Sym 是一个用 Java 写的实时论坛,欢迎来体验! 初衷 Sym 的诞生是有如下几点原因: 我们想实现一种新的网络社区体验,独立博客+社区互动 大多数论坛用户体验不够现代化,想做一个和聊 Q ...

  5. 【MFC】如何在mfc窗口程序中调用控制台

    1.工程名为Zero,在CZeroDlg.cpp中加入头文件 #include “conio.h” : 2.在CZeroDlg::OnInitDialog() {…}函数中加入AllocConsole ...

  6. 读书笔记7-浪潮之巅(part2)

    浪潮之巅 ——成功的公司各有各的绝招,而失败的公司倒有不少的共同之处 奔腾的芯(Intel) 前身:在处理器性能还很平庸的年代,站在科技前沿的计算机公司都是集中在工作站级处理器领域的,而同IBM.DE ...

  7. UWP Ad

    1.对于 UWP 应用:使用 Visual Studio 2015 安装 Microsoft Store Services SDK 2.对于通用 Windows 平台 (UWP) 项目:展开通用 Wi ...

  8. 基于MapReduce的贝叶斯网络算法研究参考文献

    原文链接(系列):http://blog.csdn.net/XuanZuoNuo/article/details/10472219 论文: 加速贝叶斯网络:Accelerating Bayesian ...

  9. @RestController无法自动注入的问题

    今天在练习spring  boot的时候,发现在ide中无法将@RestController注入到代码中,@RestController注解依赖的包是org.springframework.web,检 ...

  10. Multitier architecture-n-tier architecture

    In software engineering, multitier architecture (often referred to as n-tier architecture) or multil ...