·RMQ的ST算法    状态设计:        F[i, j]表示从第i个数起连续2^j个数中的最大值    状态转移方程(二进制思想):        F[i, j]=max(F[i,j-1], F[i + 2^(j-1),j-1])    查询时:        因为这个区间的长度为j - i + 1,所以我们可以取k=log2( j - i + 1),        则有:RMQ(A, i, j)=max{F[i , k], F[ j - 2 ^ k + 1, k]}.…
RMQ(Range Minimum/Maximum Query),即区间最值查询,是指这样一个问题:对于长度为n的数列a,回答若干询问RMQ(A,i,j)(i, j<=n),返回数列a中下标在i,j之间的最小/大值.如果只有一次询问,那样只有一遍for就可以搞定,但是如果有许多次询问就无法在很快的时间处理出来.在这里介绍一个在线算法.所谓在线算法,是指用户每输入一个查询便马上处理一个查询.该算法一般用较长的时间做预处理,待信息充足以后便可以用较少的时间回答每个查询.ST(Sparse Table…
比赛当中,常会出现RMQ问题,即求区间最大(小)值.我们该怎样解决呢? 主要方法有线段树.ST.树状数组.splay. 例题 题目描述 2008年9月25日21点10分,酒泉卫星发射中心指控大厅里,随着指挥员一声令下,长征二号F型火箭在夜空下点火起飞,神舟七号飞船载着翟志刚.刘伯明.景海鹏3位航天员,在戈壁茫茫的深邃夜空中飞向太空,开始人类漫步太空之旅.第583秒,火箭以7.5公里/秒的速度,将飞船送到近地点200公里.远地点350公里的椭圆轨道入口.而此时,火箭的燃料也消耗殆尽,即将以悲壮的方…
#include<stdio.h> #include<string.h> #include<iostream> using namespace std; ; ],Min[N][],a[N]; void ST(int *a,int n)//预处理,O(NlogN) { ;i<=n;i++) Min[i][]=Max[i][]=a[i]; ;j<=;j++) { ;i<=n;i++) { <<(j-))<=n) { Max[i][j]=m…
一.相关定义 RMQ问题 求给定区间的最值: 一般题目给定许多询问区间. 常见问题:对于长度为n的数列A,回答若干询问RMQ(A,i,j)(i,j<=n),返回数列A中下标在i,j之间的最小/大值. 解决方法 暴力搜索    O(n)-O(n) 线段树 O(n)-O(q*logn) ST算法       O(n*logn)-O(1) 二.ST(Sparse Table)算法 本节介绍了一种比较高效的在线算法(ST算法)解决RMQ问题. ST算法 是一个非常有名的在线处理RMQ问题的算法: 基于D…
目录 一.ST算法 二.ST算法の具体实现 1. 初始化 2. 求出ST表 3. 询问 三.例题 例1:P3865 [模板]ST表 例2:P2880 [USACO07JAN]平衡的阵容Balanced Lineup 一.ST算法 ST算法(Sparse Table Algorithm)是用于解决RMQ问题(区间最值问题,即Range Maximum/Minimum Question)的一种著名算法. ST算法能在复杂度为\(O(NlogN)\)的预处理后,以\(O(1)\)的复杂度在线处理序列区…
/* RMQ(Range Minimum/Maximum Query)问题: RMQ问题是求给定区间中的最值问题.当然,最简单的算法是O(n)的,但是对于查询次数很多(设置多大100万次),O(n)的算法效率不够.可以用线段树将算法优化到O(logn)(在线段树中保存线段的最值).不过,Sparse_Table算法才是最好的:它可以在O(nlogn)的预处理以后实现O(1)的查询效率.下面把Sparse Table算法分成预处理和查询两部分来说明(以求最小值为例). 预处理: 预处理使用DP的思…
解决区间查询最大值最小值的问题 用 $O(N * logN)$ 的复杂度预处理 查询的时候只要 $O(1)$ 的时间  这个算法是 real 小清新了   有一个长度为 N 的数组进行 M 次查询 可以查询区间最大值和最小值 #include <iostream> #include <stdio.h> #include <math.h> #include <algorithm> #include <cstdio> using namespace…
前几天群里看到有人问[JSOI2008]最大数,一道很简单的问题,线段树无脑做,但是看到了动态ST,emmm,学学吧,听大佬说了下思路,还好,不难的: 四道题都可以用其他数据结构或做法代替,例如线段树,dp什么的,但这不重要,毕竟学的就是ST表,触类旁通,数据结构很多知识都是可以互通的,例如一维推广到二维,可持久化这些: 倍增思想,常见的有: 1. 2^(x1)+2^(x2)...2^(xn)=2^n (max{xi}<=logn) 对于正整数x,存在一个二进制表示方法,例如11=1011(2)…
#include <stdio.h> #include <string.h> ; int a[N]; ]; inline int min(const int &a, const int &b) { return a < b ? a : b; } /* dp[i][j] 表示以i开头的,长度为2^j的区间中的最小值 很明显dp[i][0] = a[i]; 且转移方程为 dp[i][j] = min(dp[i][j-1], dp[i+(1<<(j-1)…