Segment Tree Range Minimum Query.

int rangeMinQuery(int segTree[], int qlow, int qhigh, int low, int high, int pos) {
    if (qlow <= low && qhigh >= high)
        return segTree[pos];
    if (qlow > high || qhigh < low)
        return maxVal;
    int mid = (low + high) / 2;
    return min(rangeMinQuery(segTree, qlow, qhigh, low, mid, 2*pos+1),
               rangeMinQuery(segTree, qlow, qhigh, mid+1, high, 2*pos+2));
}

void constructTree(int input[], int segTree[], int low, int high, int pos) {
    if (low == high) {
        segTree[pos] = input[low];
        return;
    }
    int mid = (low + high) / 2;
    constructTree(input, segTree, low, mid, 2*pos+1);
    constructTree(input, segTree, mid+1, high, 2*pos+2);
    segTree[pos] = min(segTree[2*pos+1], segTree[2*pos+2]);
}

  

原文地址:https://www.cnblogs.com/ruruozhenhao/p/10051343.html

时间: 2024-11-07 12:48:11

Segment Tree Range Minimum Query.的相关文章

Geeks - Range Minimum Query RMQ范围最小值查询

使用线段树预处理,可以使得查询RMQ时间效率在O(lgn). 线段树是记录某范围内的最小值. 标准的线段树应用. Geeks上只有两道线段树的题目了,而且没有讲到pushUp和pushDown操作,只是线段树的入门了. 参考:http://www.geeksforgeeks.org/segment-tree-set-1-range-minimum-query/ 我修改了一下他的程序,使用pushUp操作,其实也是很简单的一个小函数.而且手动计算了下,觉得他的动态分配内存,计算需要的树的大小,这样

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 following operations: find(s,t): report the mimimum element in as,as+1,...,at. update(i,x): change ai to x. Note that the initial values of ai (i=0,1

范围最小值问题(Range Minimum Query,RMQ)

问题描述 给定一个n个元素的序列{A1,A2,--,An},在要求的区间Query(L,R)内找到最小值:min{AL,AL+1,--,AR}.hiho16 算法描述 在这里介绍最常用的Tarjan的Sparse-Table算法,它的预处理时间复杂度为O(nlogn),而查询时间只需要O(1).令calc(i,j)表示从i开始的,长度为2j 的一段子序列的最小值,则使用循环的方式计算:calc[i][j] = min(calc[i][j-1],calc[i+2j-1)][j-1]),代码如下:

Lintcode202 Segment Tree Query solution 题解

[题目描述] For an integer array (index from 0 to n-1, where n is the size of this array), in the corresponding Segment Tree, each node stores an extra attribute max to denote the maximum number in the interval of the array (index from start to end). 对于一个

2-D range sum query implementation(2-D segment tree)

Google interview question:一个二维数组,有两个方法,一个是update(x,y),更新一个cell的值,一个是query(x1,y1,x2,y2),查询(x1,y1,x2,y2)矩形内所有元素的和. Senario 1. update调用次数远大于query. Senario 2. query调用次数远大于update. Senario 3. 两种方法调用一样多. 对于senario 1,只需要用一个二维数组储存数据,update相应的cell,时间复杂度O(1),qu

HDU 1394 Minimum Inversion Number Segment Tree解法

本题有两个考点: 1 求逆序数的性质 计算逆序数的公式, 一个数arr[i]从前面放到后面,必然会有n-arr[i]-1个数比这个大,那么就有n-arr[i]-1个逆序数增加,同时因为前面少了个arr[i]数,那么就必然有arr[i]个(加上零)数比起小的数失去一个逆序数,总共失去arr[i]个逆序数,所以新的逆序数为增加了n-arr[i]-1-arr[i]个逆序数(当然有可能是减小了,视arr[i]的值而定. 2 如何求一个数列的逆序数 可以使用归并排序来求,也可以使用线段树来求.两者都是二分

Segment Tree Query I &amp; II

Segment Tree Query I For an integer array (index from 0 to n-1, where n is the size of this array), in the corresponding SegmentTree, each node stores an extra attribute max to denote the maximum number in the interval of the array (index from start

Lintcode: Segment Tree Query

For an integer array (index from 0 to n-1, where n is the size of this array), in the corresponding SegmentTree, each node stores an extra attribute max to denote the maximum number in the interval of the array (index from start to end). Design a que

Segment Tree - Sum of given range

简单点说其实Segment Tree就是二分法的灵活运用. 需要的基础知识: 1 二分法 2 二叉树 3 最好熟悉堆排序 操作就是二分法和堆排序巧妙地合并起来. 有了这些基础知识Segment Tree就没有任何难度了. 参考原文: http://www.geeksforgeeks.org/segment-tree-set-1-sum-of-given-range/ 下面程序是一个类,现在只实现查找sum的操作. 注意: 1 如何在数组中定义树的跟和孩子节点,及如何计算 --  堆排序也需要的知