RMQ求解->ST表】的更多相关文章

ST表 这是一种神奇的数据结构,用nlogn的空间与nlongn的预处理得出O(1)的区间最大最小值(无修) 那么来看看这个核心数组:ST[][] ST[i][j]表示从i到i+(1<<j)的范围内的最大/最小值 那么来看看代码吧. #include <cstdio> #include <algorithm> using namespace std; ][],n; void makeST() { ;j<=;j++) { ;i+(<<j)-<=n;…
士兵杀敌(三) 时间限制:2000 ms  |  内存限制:65535 KB 难度:5 描述 南将军统率着N个士兵,士兵分别编号为1~N,南将军经常爱拿某一段编号内杀敌数最高的人与杀敌数最低的人进行比较,计算出两个人的杀敌数差值,用这种方法一方面能鼓舞杀敌数高的人,另一方面也算是批评杀敌数低的人,起到了很好的效果. 所以,南将军经常问军师小工第i号士兵到第j号士兵中,杀敌数最高的人与杀敌数最低的人之间军功差值是多少. 现在,请你写一个程序,帮小工回答南将军每次的询问吧. 注意,南将军可能询问很多…
2017-08-26 22:25:57 writer:pprp 题意很简单,给你一串数字,问你给定区间中最大值减去给定区间中的最小值是多少? 用ST表即可实现 一开始无脑套模板,找了最大值,找了最小值,分别用两个函数实现,实际上十分冗余 所以TLE了 之后改成一个函数中同时处理最大值和最小值,就可以了 AC代码如下: /* @theme:poj 3264 @writer:pprp @declare:ST表(sparse table)稀疏表,用动态规划的思想来解决RMQ问题: @date:2017…
思路: (我也不知道这是不是正解) ST表预处理出来原数列的两点之间的min 再搞一个动态开节点线段树 节点记录ans 和标记 lazy=-1 当前节点的ans可用  lazy=0 没被覆盖过 else 区间覆盖 push_up的时候要注意好多细节,, 数组尽量往大开 //By SiriusRen #include <cstdio> #include <cstring> #include <algorithm> using namespace std; ; ],lson…
ST表 \(\text{ST}\) 表是用于解决可重复贡献问题的数据结构. 可重复贡献问题:区间按位和.区间按位或.区间 \(\gcd\) .区间最大.区间最小等满足结合律且可重复统计的问题. 模板预处理:(以区间最大值为例) void pre_work() { for(int i=2;i<=n;i++) lg2[i]=lg2[i/2]+1; pow2[0]=1; for(int i=1;i<=lg2[n];i++) pow2[i]=pow2[i-1]*2; for(int i=1;i<…
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int N, M, a[100009], l, r, st[100009][20]; inline int read() { int s=0, w=1; char ch=getchar(); while( ch<'0' || ch>'9' ){ if(ch=='-') w=-1; ch=getchar(); } w…
此算法可用来处理区间最值问题,预处理时间为O(nlogn),查询时间为O(1) 此算法主要基于倍增思想,用以数组st[i][j]表示从第i个元素开始向后搜2的j次方的最值 可用递推的方式求得:st[i][j]=min/max(st[i][j-1],st[i+1<<(j-1)][j-1]) 下面的模板以区间最大值为例 #include<iostream>#include<cstdio>#include<cstring>#include<string>…
洛谷3865 #include<cstdio> #include<algorithm> #include<cmath> using namespace std; ; ],n,m,l,r; void read(int &k){ k=; ; char c=getchar(); ),c=getchar(); +c-',c=getchar(); k*=f; } int main(){ read(n); read(m); ;i<=n;i++) read(f[i][]…
题目链接 \(Description\) 给定一棵树.每次询问给定\(a\sim b,c\sim d\)两个下标区间,从这两个区间中各取一个点,使得这两个点距离最远.输出最远距离. \(n,q\leq10^5\). \(Solution\) 一个集合直径的两端点,在被划分为两个集合后一定是两个集合直径的四个端点中的两个. 即假设将\(S\)分为两个集合后,另外两个集合的直径的两端点分别为a,b和c,d,那么\(S\)集合的直径的两端点一定是a,b,c,d中的两个. 证明类似树的直径. 所以信息可…
我当时知道ST表可以 \(O(1)\) 求 LCA 的时候是极为震惊的,可以在需要反复使用 LCA 的时候卡常使用. ST表!用于解决 RMQ问题 ST表 我可能写得不好,看专业的 怎么实现? 考虑把求 LCA 转换为 RMQ问题.我们对于树求一遍欧拉序,就是那个回溯也会记录的那个.我们处理出每个数第一次在欧拉序中出现的位置,欧拉序上每个位置的深度,以及欧拉序上每个位置出现的点的编号.这些信息都可以在一次 \(dfs\) 中求出.然后不难发现在回溯过程中加入的点是之前遍历的点的祖先,由此也不难推…
例题:https://www.acwing.com/problem/content/1272/ ST表类似于dp. 定义st[i][j]表示以i为起点,长度位2^j的一段区间,即[ i , i + 2^j - 1 ]. 而这个区间又可以被拆分为[i,i+2^(j-1)-1]+[ i + 2 ^ ( j - 1 ) , i + 2 ^ j - 1 ]这两个区间可以这样表示st[i][j-1]和st[i+(1<<(j-1))][j-1] 所以 st[i][j] = m(st[i][j-],st[i…
传送门:http://poj.org/problem?id=3264 Balanced Lineup Time Limit: 5000MS   Memory Limit: 65536K Total Submissions: 66241   Accepted: 30833 Case Time Limit: 2000MS Description For the daily milking, Farmer John's N cows (1 ≤ N ≤ 50,000) always line up in…
$RMQ$问题:给定一个长度为$N$的区间,$M$个询问,每次询问$[L_i,R_i]$这段区间元素的最大值/最小值. $RMQ$的高级写法一般有两种,即为线段树和$ST$表. 本文主要讲解一下$ST$表的写法.(以区间最大值为例) $ST$表:一种利用$dp$思想求解区间最值的倍增算法. 定义:$f(i,j)$表示$[i,i+2^{j}-1]$这段长度为$2^{j}$的区间中的最大值. 预处理:$f(i,0)=a_i$.即$[i,i]$区间的最大值就是$a_i$. 状态转移:将$[i,j]$平…
2017-08-26 21:44:45 writer:pprp RMQ问题就是区间最大最小值查询问题: 这个SparseTable算法构造一个表,F[i][j] 表示 区间[i, i + 2 ^ j -1]的最大或者最小值 ST分为两个部分 1.nlogn的预处理 预处理主要用到了动态规划,二分区间每个区间长度为 2 ^ (j -1)找到一个递推关系: F[i][j] = min(F[i][j - 1],F[i + (1 << (j - 1))][j - 1]); 2.查询部分更为巧O(1)得…
解题关键:rmq模板题,可以用st表,亦可用线段树等数据结构 log10和log2都可,这里用到了对数的换底公式 类似于区间dp,用到了倍增的思想 $F[i][j] = \min (F[i][j - 1],F[i + 1 <  < (j - 1)][j - 1])$ #include<cstdio> #include<cstring> #include<algorithm> #include<cstdlib> #include<cmath&…
RMQ(Range Minimum/Maximum Query)问题指的是一类对于给定序列,要求支持查询某区间内的最大.最小值的问题.很显然,如果暴力预处理的话复杂度为 \(O(n^2)\),而此类问题数据又往往很大,不仅会爆时间,数组也存不下.我们需要一种能够 \(O(n\log n)\) 甚至 \(O(n)\) 预处理的数据结构,这便是ST表. ST表(Sparse Table,应译为S表)是一种可以以 \(O(n\log n)\) 的优秀复杂度预处理出静态区间上的最大.最小值的算法,其核心…
\(0.\) RMQ问题 P1816 人话翻译 给定一个长度为\(n\)的数列\(a\),然后有\(m\)组询问,每次询问一个区间\([l,r]\)的最小值. 其中\(m,n\leq10^5\) \(1.\) 暴力做法 很显然,暴力做法就是便历 \(\max\limits_{l\leq i\leq r}a_i\) .这个做法最坏时间复杂度将会高达\(O(n^2)\).很显然,这对于\(1e5\)的数据范围要炸 \(2.\) 正解 线段树 如果不知道什么是线段树,请点击这里 线段树 对于这种区间信…
RMQ RMQ (Range Minimum Query),指求区间最小值.普通的求区间最小值的方法是暴力. 对于一个数列: \[ A_1,~ A_2,~ A_3,~ \cdots,~ A_n \] 对于一个给定的区间\([l, ~r], ~1≤ l ≤r ≤ n\),\(\min \{A_l, A_{l + 1}, \cdots,A_r\}\)的计算就是RMQ问题. 此解法为\(\text{Sparse-Table}\)解法,简称\(ST\)表. 预处理:预处理为对数据进行\(n\log n\…
RMQ问题: RMQ(Range Minimum/Maximum Query),区间最值查询.对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值. RMQ问题可以用线段树和ST表解决. 线段树:查询复杂度O(log n) 可以修改数列中的值 ST表: 查询复杂度 O(1) 无法修改数列中的值,是在线算法 其实ST表就是个动态规划 核心思想:倍增 对于dp[i][j] ,其含义为以i为起点,长度为2^j这个区间的最大值 转移方程就是把这…
RMQ即Range Minimum/Maximun Query,中文意思:查询一个区间的最小值/最大值 比如有这样一个数组:A{3 2 4 5 6 8 1 2 9 7},然后问你若干问题: 数组A下标2~7区间最小的值是多少?       最小值是(1) 数组A下标3~6区间最小的值是多少?       最小值是(4) 数组A下标1~10区间最小的值是多少?      最小值是(1) ...... 专业术语:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标…
ST表 ST表是一种解决RMQ问题的强有力工具, 可以做到O(nlogn)预处理,O(1)查询. st[i][j] 表示区间 [i, i + 2 ^ j - 1] 的最大值. 初值 st[i][0] = a[i]. 状态转移 st[i][j] = max(st[i][j - 1],  st[i + 2 ^ ( j - 1)][j - 1]).. 初始化: inline void init(){ for(int i = 1; (1 << i) <= n; i ++) for(int j =…
题面:P2880 [USACO07JAN]平衡的阵容Balanced Lineup 题解: ST表板子 代码: #include<cstdio> #include<cstring> #include<iostream> #define max(a,b) ((a)>(b)?(a):(b)) #define min(a,b) ((a)<(b)?(a):(b)) using namespace std; ,max_log=,maxlog=,inf=<<…
离线RAQ时,预处理为O(n*lgn),查询为O(1)的算法,比较有意思的一种算法 放个模板在这可以随时看 //ST表(离线) //预处理 O(n*lgn) , 查询 O(1) #include <iostream> #include <stdio.h> using namespace std; #define MX 10005 int n; int a[MX]; ]; // st[i][j] 是第 i 个数为左端点长为 2^j 区间的最大值 int lgn[MX]; //lgn[…
Glad You Came Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 262144/262144 K (Java/Others)Total Submission(s): 1489    Accepted Submission(s): 629 Problem Description Steve has an integer array a of length n (1-based). He assigned all the e…
Summer again! Flynn is ready for another tour around. Since the tour would take three or more days, it is important to find a hotel that meets for a reasonable price and gets as near as possible! But there are so many of them! Flynn gets tired to loo…
ST算法介绍:[转自http://blog.csdn.net/insistgogo/article/details/9929103] 作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 方法:ST算法分成两部分:离线预处理 (nlogn)和 在线查询(O(1)).虽然还可以使用线段树.树状链表等求解区间最值,但是ST算法要比它们更快,而且适用于在线查询. (1)离线预处理:运用DP思想,用于求解区间最值,并保存到一个二维数组中. (2)在线查询:对给定区间进行分割,借助该二维数组求最…
今天打了人生第一道ST表题(其实只是ST表跑得最快); ST表是一种用来解决RMQ问题的利器... 大体操作有两步: 第一部分nlogn预处理 第二部分O(1)询问 预处理就是运用倍增+区间动规 ST表使用DP思想求解区间最值,貌似属于区间动态规划,不过区间在增加时,每次并不是增加一个长度,而是使用倍增的思想,每次增加2^i个长度. 使用F[i,j]表示以i为起点,区间长度为2^j的区间最值,此时区间为[i,i + 2^j - 1]. 比如,F[0,2]表示区间[0,3]的最值,F[2,2]表示…
ST表是一种利用DP思想求解最值的倍增算法 ST表常用于解决RMQ问题,即求解区间最值问题 接下来以求最大值为例分步讲解一下ST表的建立过程: 1.定义 f[i][j]表示[i,i+2j-1]这个长度为2j的区间中的最大值 2.预处理 f[i][0]=a[i],即区间[i,i]的最大值就是a[i] 3.状态转移 将[i,i+2j-1]平均分成两份,分别为[i,i+2j-1-1]和[i+2j-1,i+2j-1],两段的长度均为2j [i,i+2j-1]的最大值为这两段的最大值中的较大值,即f[i]…
RMQ (Range Minimum/Maximum Query)问题是指: 对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j里的最小(大)值,RMQ问题是指求区间最值的问题. for循环遍历一边,然后输出,那么你很容易想到会被T飞掉: 1.先写一种比较高效的ST算法解决这个问题. 线段树预处理O(nlogn),查询O(logn),支持在线修改 ST表预处理O(nlogn),查询O(1),但不支持在线修改 其实ST表是一种动态规划的思想:每次运用倍…
<题目链接> 题目大意:给你一棵带有边权的树,然后进行q次查询,每次查询输出指定两个节点之间的距离. 解题分析:本题有多重解决方法,首先,可用最短路轻易求解.若只用LCA解决本题,也有三种常用的做法,具体方法如下: LCA转RMQ解法: #include <cstdio> #include <cmath> #include <vector> #include <cstring> #include <algorithm> using n…