rmq专题

洛谷 P3379:最近公共祖先(LCA)← RMQ+欧拉序

【题目来源】https://www.luogu.com.cn/problem/P3379【题目描述】 如题,给定一棵有根多叉树,请求出指定两个点直接最近的公共祖先。【输入格式】 第一行包含三个正整数 N,M,S,分别表示树的结点个数、询问的个数和树根结点的序号。 接下来 N−1 行每行包含两个正整数 x,y,表示 x 结点和 y 结点之间有一条直接连接的边(数据保证可以构成树)。 接下来 M 行每

AcWing 1273:天才的记忆 ← ST算法求解RMQ问题

【题目来源】https://www.acwing.com/problem/content/1275/【题目描述】 从前有个人名叫 WNB,他有着天才般的记忆力,他珍藏了许多许多的宝藏。 在他离世之后留给后人一个难题(专门考验记忆力的啊!),如果谁能轻松回答出这个问题,便可以继承他的宝藏。 题目是这样的:给你一大串数字(编号为 1 到 N,大小可不一定哦!),在你看过一遍之后,它便消失在你面前,随后

POJ 2019 Cornfields 二维RMQ

题目来源:POJ 2019 Cornfields 题意:求正方形二维区间最大最小值的差 思路:直接二维ST搞 试模版而已 #include <cstdio>#include <algorithm>#include <cmath>using namespace std;const int maxn = 255;int dp[maxn][maxn][8][8];int dp

hdu 5266 pog loves szh III LCA+RMQ

题意: 给你一棵树,然后询问l~r节点的最近公共祖先(LCA)。 思路: 用RMQ维护一段区间的LCA,然后询问时,将两个区间的LCA再求一次LCA即可。 code: #pragma comment(linker, "/STACK:102400000,102400000")#include <cstdlib>#include <cstdio>#include <cstring>

RMQ区间求最值 后缀数组height预处理(区间求最小值)

首先是一般的RMQ区间求最值问题 minsum[i][j]表示起始位置为i长度为j的区间内的最小值。RMQ利用二进制优化处理。 所以,他的状态转移方程就是  F[i, j]=max(F[i,j-1], F[i + 2^(j-1),j-1]) 查询区间[i][j]的最小值相当于区间[i][k]和区间[t][j]的最小值,其中k>=t void RMQ(int num){for(i

组队赛第六场:贪心+RMQ加二分

UVALive 6606 Meeting Room Arrangement COJ有这题,一模一样的,COJ应该是从这个OJ上拿的吧。 按右端点排序,然后从第一个开始贪心的取相邻的。 #include<iostream>#include<cstdio>#include<cstring>#include<algorithm>#include<map>#include<queue>

UVA 11235 - Frequent values (RMQ的基础应用)

题意:给出一个非降序排列的整数数组a[1], a[2], ...... , a[n],给出一系列询问(i, j),回答a[i], a[i+1], ...... , a[j]中出现最多的值所出现的次数。 思路:典型的RMQ应用,第一次仿着写,将数组游程编码,value[i]和cnt[i]分别表示第i段的数值和出现次数,num[p], left[p], right[p]分别表示位置p所在段的编号和左

hdu 5288 OO’s Sequence(two point + rmq)

题目链接:hdu 5288 OO’s Sequence #include <cstdio>#include <cstring>#include <vector>#include <algorithm>using namespace std;const int maxn = 1e4 + 5;const int maxm = 1e5 + 5;const int mod = 1e9 +

UVA 11235 - Frequent values(RMQ)

UVA 11235 - Frequent values 题目链接 题意:给定一个升序数列,每次询问一个区间[l, r],求出其中相同数字最大的个数 思路:RMQ,由于是升序,所以数字大小相同的必然连在一块,先预处理出一共有多少段,每段包含多少个数字,和原数组中每个位置对应哪一段,最左边位置和最右边位置,然后每次询问的时候,可以把询问[L, R]的时候可以分成三段: 1、L到r[L]为

HDU3183(RMQ+鸽巢原理)

题目的意思是对于一个n位数,删除m个位后,得到的最小数是什么,比如12345 2,删除两个位,得到最小的就是123.实际上这题目解法很多,好像有贪心,线段树,RMQ等,因为我最近在学习RMQ,所以就用RMQ了。 这题目用了一个鸽巢原理,得到的m-n位数的第一位,必然出现在1~m-n+1,这个由鸽巢原理就十分明显了(如果1~n-(m-n)+1都没有的话,剩下的m-n-1个位是不可能凑出m-n个位的

RMQ算法:区间最值问题

RMQ(Range Minimum/Maximum Query)问题是求区间最值问题。ST算法,它可以做到O(nlogn)的预处理,O(1)地回答每个询问。看一下ST算法是怎么实现的(以最大值为例): 首先是预处理,用一个DP解决。设a[i]是要求区间最值的数列,f[i,j]表示从第i个数起连续2^j个数中的最大值。例如数列3 2 4 5 6 8 1 2 9 7 ,f[1,0]表示第1个数起,长

Codeforces Round #291 (Div. 2) D. R2D2 and Droid Army RMQ问题 ST算法

D. R2D2 and Droid Army time limit per test 2 seconds memory limit per test 256 megabytes input standard input output standard output An army of n droids is lined up in one row. Each

NYOJ119士兵杀敌(三)RMQ问题之ST…

题目地址 题目大意:求一段区间内的最大值和最小值的差值,查询次数非常大。 第一次接触RMQ类型的题目,在百度百科科普了一下。 RMQ问题 RMQ (Range Minimum/MaximumQuery)问题是指:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,也就是说,RMQ问题是指求区间最值的问题。 ST算法:

RMQ问题分析

RMQ问题是一类经典问题,在ACM编程竞赛中我们经常会见到它的身影。其中RMQ是Range Minimium/Maxmium Query的缩写形式,代表区间最小/最大值查询。问题描述为:对一个已知长度为n的数组a,给出多组区间[i,j],对于每个区间给出该区间的最值。该问题需要注意的地方是要处理多组数据。   常规解法是直接遍历区间[i,j]对应的数组元素,然后找出所求的最值。该方法在只有一

RMQ小结

RMQ小结 区间求值得算法主要有三种: 一、处理O(N),查询O(N*Q)   (朴素) 二、处理O(log N),查询(QlogN) (线段树) 三、处理O(nlogn),查询(1)    (RMQ) 而我们主要来讲一下,O(nlogn)-O(1)的RMQ算法。而RMQ算法的实现又有多种算法,我就选了一种性价比最高的讲

Vision_数据结构_RMQ

///定义: /*         RMQ算法,是一个快速求区间最值的离线算法,     预处理时间复杂度O(n*log(n)),查询O(1),所以是一个很快速的算法,     当然这个问题用线段树同样能够解决。 */ ///代码: /***name:RMQ**function:求区间最值**输入参数:区间左右边界**输出参数:返回最值**复杂

POJ 3368 Frequent values RMQ / 线段树

题意;给定一个升序的数列(1-100000), 比如 array[10] =  -1  -1  1  1  1  1  3  10  10  10, 求其中某段区间上相同的数字最多有几个。[ 2, 3 ] = 1, [ 1, 10 ] = 4, [ 5, 10 ] = 3。(下标从1开始)。 题解:先将连续相等的几个数合并为一个部分(part), 或者说一个点。每点包括了起始位置,终止位置,相等

POJ 3264 Balanced Lineup RMQ / 线段树

题意:给出一个队列,找出指定区间的最大值与最小值。 题解:RMQ, 注意边界需要理清楚。 参考http://www.cnblogs.com/cnjy/archive/2009/08/30/1556566.html     RMQ(Range Minimum/Maximum Query)问题:     RMQ问题是求给定区间中的最值问题。当然,最简单的算法是O(n)的,但是对于查询次数很多(设

POJ 3264(ST实现RMQ)

题目链接:点击打开链接 题目大意:给一个n和q,n代表有n个数,q代表q次查询。每次查询输入两个数字a,b,问你从第a个数字到第b个数字间的最大值减去最小值的值是多少。 题目思路:如果直接搜,查一次就O(n),铁定爆炸。这里线段树和ST算法都可以,线段树好像挺麻烦先学一波ST解法一会儿去学线段树,美滋滋。不过像这种单纯的求区间最值的问题,还是用ST比较好,因为ST算法预处理nlogn,

【LOJP4137】Rmq Problem / mex 主席树求区间MEX

传送⻔ 题意 分析 我们用主席树维护每一个数最后一次出现的位置,然后每次查询就在第 r r r棵树上求最小的,位置小于 l l l的数 代码 #include <bits/stdc++.h>#define debug(x) cout<<#x<<":"<<x<<endl;#define dl(x) printf("%lld\n",x);#define di(x) printf("

51nod 1174 区间中最大的数(RMQ)

1174 区间中最大的数 基准时间限制:1 秒 空间限制:131072 KB 分值: 0  难度:基础题  收藏  关注 给出一个有N个数的序列,编号0 - N - 1。进行Q次查询,查询编号i至j的所有数中,最大的数是多少。 例如: 1 7 6 3 1。i = 1, j = 3,对应的数为7 6 3,最大的数为7。(该问题也被称为RMQ问题)

Circular RMQ

You are given circular array a0, a1, ..., an - 1. There are two types of operations with it: inc(lf, rg, v) — this operation increases each element on the segment [lf, rg] (inclusively) by v;rmq(lf,

hdu 5443 The Water Problem(RMQ区间最值)

题目:http://acm.hdu.edu.cn/showproblem.php?pid=5443 Problem Description In Land waterless, water is a very limited resource. People always fight for the biggest source of water. Given a sequence

【蓝桥杯】RMQ(Range Minimum/Maximum Query)

一.概述 RMQ问题,是求区间最大值或最小值,即范围最值问题。 暴力解法是对每个询问区间循环求解,设区间长度n,询问次数m,则复杂度是O ( nm )。 一般还可以使用线段树求解,复杂度是O(mlogn)。 但还有一种更简便的ST算法,预处理复杂度是O(nlogn),查询O(1)。 二.ST(Sparse Table)算法 它适用于静态空间的RMQ查询。 给定长度为n的静态数列,

POJ 3264 Balanced Lineup (RMQ模板)

Balanced Lineup Time Limit: 5000MS Memory Limit: 65536KTotal Submissions: 65283 Accepted: 30409Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) alway

[bzoj3489] A simple rmq problem 解题报告

说几种比较傻逼的做法: 考虑一个点i,设它前面第一个和它相等的点的位置是 lasti last_i(若没有就是0),设它后面第一个和它相等的点的位置是 nexti next_i(如果没有就是n+1),则它会产生贡献的区间[l,r]要求 lasti+1≤l≤i,i≤r≤nexti−1 last_i+1\le l \le i,i\le r \le next_i-1。所以如果把询问的区间看作平面上的点