RMQ问题--范围最小值问题】的更多相关文章

hdu 3183 A Magic Lamp RMQ ST 坐标最小值 题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=3183 题目大意: 从给定的串中挑出来m个数使得剩余的数字最小,串的序列不能改变 思路: 将问题转化为求在n个数中挑选n-m个数,使之最小.假设最极端的情况,所有最大的数字都在左侧,占据了m个位置,那么我们需要挑选的最小的数字的第一位就是在m+1位上.依次类推,第二位在m+2位上,最后一位也就在原串的最后一位上.反过来,假设最大的数…
范围最小值问题(Range Minium Query,RMQ)---RMQ问题 一.一维问题 给出一个n个元素的数组A1,A2,...,An, 设计一个数据结构, 支持查询操作Query(L,R):计算min(AL,AL+1,...AR) 显然, 用一个循环来计算最小值 显然不够快, 即使是前缀和的思想也不能提高效率! 那么, 实践中最常用的是Tarjan的Sparse-Table算法(就是ST表) 预处理时间:O(nlogn) 查询时间:O(1) (这个算法非常好写,而且还不容易出错) (其实…
/*RMQ 更新最小值操作 By:draymonder*/ #include <iostream> #include <cstdio> using namespace std; ; << ; const int INF = 0x3f3f3f3f; typedef long long LL; *maxn-]; void init(int a)//把元素个数扩充到2的幂 简便 { n = ; while (n < a) n*=; ;i<*n-;i++) s[i]…
区间的最大值和最小值 #include <cstdio> #include <cstring> #include <cmath> #include <iostream> using namespace std; ; int n,query; int num[MAXN]; ],F_Max[MAXN][]; void Init() { ; i <= n; i++) { F_Min[i][] = F_Max[i][] = num[i]; } ; (<&…
首先讲一下RMQ算法的意思. RMQ(Range Minimum Query,RMQ)范围最小值,给出一个n个元素的数组,计算min(A[L],A[L+1],...,A[R-1],A[R]): 这里运用了dp,先构建d[i][j]表示第i位开始2^j个元素中最小的值: 转移方程d[i][j]=min(d[i][j-1],d[i+2^(j-1)][j-1]): 建议画一张图来体验一下这个的意思. 实现: void RMQ_init(int n) { ;i<=n;i++) d[i][]=s1[i];…
A Magic Lamp Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) Total Submission(s): 2742    Accepted Submission(s): 1071 Problem Description Kiki likes traveling. One day she finds a magic lamp, unfortunately the gen…
题目大意就是有很多牛.告诉你每只牛的高度.然后有很多个询问.输出该区间内的最大身高差.也就是用RMQ求最大值最小值.貌似还可以用线段树.然而,我还不会线段树.....T_T 可能是太多组数据了.cin和cout会TLE.换成scanf和printf就顺当的AC了....啦啦啦. RMQ还是只会用模板..T_T 附代码:#include<stdio.h>#include<string.h>#include<iostream>#include<math.h>#d…
题意: 有n个旅馆,从这n个旅馆中找出若干个旅馆,使得这若干个旅馆满足这样的条件:不能从其它和剩下的旅馆中找到一个价格和距离都小于这个旅馆的旅馆... 解析: 按price 排序,若price相同, 则按距离排序 然后遍历每一个旅馆,在处理当前 旅馆时,二分在price小于当前旅馆price的旅馆中 找到最后一个price小于当前旅馆price的旅馆(因为可能price相同) 然后rmq求距离最小值就可 #include <iostream> #include <cstdio> #…
全部从我大哥那里学习得来.. 一开始硬着头皮就是根据思路上线段树,明知是T还要写(因为线段树还不是很熟,趁机练一发) 后来果然T了,然后就去学了一发RMQ的ST算法,查询是O(1). ST算法主要: //把dp[i,j]平均分成两段 //(因为dp[i,j]一定是偶数个数字),从 i 到i + 2 ^ (j - 1) - 1为一段, //i + 2 ^ (j - 1)到i + 2 ^ j - 1为一段(长度都为2 ^ (j - 1)). 然后就在两秒内AC了- 主要是想证明那个复杂度的理解吧.…
基本概念 LCA:树上的最近公共祖先,对于有根树T的两个结点u.v,最近公共祖先LCA(T,u,v)表示一个结点x,满足x是u.v的祖先且x的深度尽可能大. RMQ:区间最小值查询问题.对于长度为n的数列A,回答若干询问RMQ(A,i,j),返回数列A中下标在[i,j]里的最小值下标. 朴素LCA算法 求出树上每个结点的深度. 对于查询LCA(u,v),用p1.p2指向将u.v,将p1.p2中深度较大的结点不断指向其父结点,直到p1.p2深度相同. 之后p1.p2同步向上移动,直到p1=p2,此…