luogu3865 【模板】 ST表】的更多相关文章

[算法模板]ST表 ST表和线段树一样,都能解决RMQ问题(范围最值查询-Range Minimum Query). 我们开一个数组数组\(f[maxn][maxn\log_2]\)来储存数据. 定义\(f[i][j]\)代表从\(i\)开始的\(2^{j}\)位这个区间的最大值. 初始化 因为\(f[i][0]=a[i]\),所以有: \[ f[i][j]=max(f[i][j-1],f[i+2^{j-1}][j-1]) \] 通过这个转移方程即可构造出\(f\). 查询 查询区间\([l,r…
ST表,稀疏表,用于求解经典的RMQ问题.即区间最值问题. Problem: 给定n个数和q个询问,对于给定的每个询问有l,r,求区间[l,r]的最大值.. Solution: 主要思想是倍增和区间dp. 状态:dp[i][j] 为闭区间[i,i+2^j-1]的最值. 这个状态与转移方程的关系很大,即闭区间的范围涉及到了转移方程的简便性. 转移方程:dp[i][j]=max(dp[i][j-1],dp[i+2^(j-1)][j-1]). 这是显然的,但这里有个细节:第一个项的范围为[i,i+2^…
ST表 询问静态最值. code: #include <iostream> #include <cstdio> using namespace std; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1; ch=getchar();} while(ch>='0'&&ch<='9'){sum=(sum<<…
题目大意:给出一段序列,每次查询一段区间,求区间最大值. ST表:设原序列为A,定义F[i][k]为A[i][2k-1]的最大值.有递归式:F[i][k]=max(F[i][k-1], F[i+2k-1][k-1]).设置F时,外层循环k,内部循环i.查询时,令k为2^k不超过r-l+1的最大k,返回max(F[l][i], F[r-i+1][i])(利用幂等操作)即可. 注意OffOne错误(看代码中的注释). #include <cstdio> #include <cstring&g…
给定一个长度为 \(N\) 的数列,和 \(M\) 次询问,求出每一次询问的区间\([l,r]\)内数字的最大值. 说明 对于30%的数据,满足: \(1 \leq N, M \leq 10 , 1≤N,M≤10\) 对于70%的数据,满足: \(1 \leq N, M \leq {10}^5 , 1≤N,M≤10^5\) 对于100%的数据,满足: \(1 \leq N \leq {10}^5, 1 \leq M \leq {10}^6, a_i \in [0, {10}^9], 1 \leq…
P3865 [模板]ST表 https://www.luogu.org/problemnew/show/P3865 题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1) 题目描述 给定一个长度为 NN 的数列,和 MM 次询问,求出每一次询问的区间内数字的最大值. 输入输出格式 输入格式: 第一行包含两个整数 N, MN,M ,分别表示数列的长度和询问的个数. 第二行包含 NN 个整数(记为 a_iai​…
http://blog.csdn.net/insistgogo/article/details/9929103 这篇博客讲解的很详细了,求区间最大值也可以用st表,时间复杂度O(n log(n)),查询复杂度O(1) 主要是用到区间动规 的思想(虽然我不会区间动规= =) 在求解rmq问题时,st表是很有用的 -------------------------**********************------------------------------------- 要注意的是st表只…
题目链接 本来准备自己yy一个倍增来着,然而一看要求O1查询就怂了. ST表模板.放上代码. #include<cstdio> #include<cstdlib> #include<cctype> #include<cmath> inline long long max(long long a,long long b){ return a>b?a:b; } inline long long read(){ ,f=; char ch=getchar();…
P3865 [模板]ST表 题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1) 题目描述 给定一个长度为 NN 的数列,和 MM 次询问,求出每一次询问的区间内数字的最大值. 输入输出格式 输入格式: 第一行包含两个整数 N, MN,M ,分别表示数列的长度和询问的个数. 第二行包含 NN 个整数(记为 a_iai​),依次表示数列的第 ii 项. 接下来 MM行,每行包含两个整数 l_i, r_ili…
题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) 题目描述 给定一个长度为 N 的数列,和 M 次询问,求出每一次询问的区间内数字的最大值. 输入输出格式 输入格式: 第一行包含两个整数 N,M,分别表示数列的长度和询问的个数. 第二行包含 N 个整数(记为 ai ),依次表示数列的第 i 项. 接下来 M 行,每行包含两个整数 li,ri,表示查询的区间为 [li,ri] 输出格式: 输出包含 M行,每行一…
SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决.注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响.不过访问越界是写程序的不良习惯,不应该指望进行一次额外的初始化把它消除.再重申一次对任何位置的访问都要保证不越界.有一些加了某个值之后就会越界.既然是模板那就写多两行预防以后的问题吧(比如某个整除分块也有类似的隐藏bug).实际应用的时候可以删除提高性能. 时间复杂度: 初始化1:O(MAXN) 初始化2:O(nlogn…
ST表:解决RMQ类问题,预处理$O(nlog_{2}n)$,查询$O(1)$ 较线段树来说每次查询为1,线段树为log,但ST表不方便更改 ST表还用了倍增思想. 模板: struct ST_MAP{ int log[MAXN],val[MAXN],st_max[35][MAXN],st_min[35][MAXN]; inline void build(){ log[1]=0,st_min[0][1]=st_max[0][1]=val[1]; for(int i=2;i<=n;++i){ lo…
void RMQ_init(){//ST表的创建模板 ;i<n;i++) d[i][]=mo[i]; ;(<<j)<=n;j++) ;i+(<<j)-<n;i++){ d[i][j]=min(d[i][j-],d[i+(<<(j-))][j-]); } } int RMQ_min(int L,int R){//区间最小.大值 ; <<(k+))<=R-L+) k++; <<k)+][k]); } //应用条件:不能修改!…
传送门 洛谷 Solution 实测跑的比ST表快!!! 这个东西也是\(O(1)\)的,不会可以看我上一篇Blog 代码实现 代码戳这里…
传送门(ST表裸题) ST表是一种很优雅的算法,用于求静态RMQ 数组l[i][j]表示从i开始,长度为2^j的序列中的最大值 注意事项: 1.核心部分: ; (<<j) <= n; j++) ; i+(<<j)- <= n; i++) { l[i][j] = max(l[i][j-],l[i+(<<(j-))][j-]); s[i][j] = min(s[i][j-],s[i+(<<(j-))][j-]); } 因为i~j的位数是j-i+1位,…
Definition ST表是一种用于处理静态RMQ问题(无修改区间最值问题)的最快数据结构,书写方便使用简单效率便捷.其中其预处理复杂度为O(nlogn),查询复杂度为O(1).总时间复杂度为O(nlogn).常数远小于树状数组.线段树等毒瘤数据结构. 事实上,ST表不能叫做ST表.因为T本身就代表table= = ST表在预处理时采用倍增以及DP思想,即设f[i][j]为i向右2j-1个坐标的最大值.在DP时以j为阶段进行转移. 在查询时,由于2的(被查询区间长度的对数的两倍)个单位(即22…
题目大意:区间静态最大值 题解:ST表,zkw线段树 ST表: st[i][j]存[i,i+$j^{2}$-1]的最大值,查询时把区间分成两个长度相同的小区间(可重复) #include<cstdio> #include<cctype> using namespace std; const int maxn=100010; int n,m,M; int st[maxn][20],lg[maxn]; inline int max(int a,int b){return a>b?…
https://www.luogu.org/problemnew/show/P3865 题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1) 题目描述 给定一个长度为 NN 的数列,和 MM 次询问,求出每一次询问的区间内数字的最大值. 输入输出格式 输入格式: 第一行包含两个整数 N, MN,M ,分别表示数列的长度和询问的个数. 第二行包含 NN 个整数(记为 a_iai​),依次表示数列的第 ii …
我不会ST表 智推推到这个题 发现标签中居然有线段树..? 于是贸然来了一发线段树 众所周知,线段树的查询是log(n)的 题目中"请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)" 然后草草打完代码竟然AC了..exm?? 最慢也不过400ms 数据好水 好吧,不多说上代码 首先是数据存贮,分别是左子节点,右子节点,maxx存贮当前节点的最大值 struct node{ int left,right,maxx; }tree[100000*4+10…
题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1) 题目描述 给定一个长度为 NN 的数列,和 MM 次询问,求出每一次询问的区间内数字的最大值. 输入输出格式 输入格式: 第一行包含两个整数 N, MN,M ,分别表示数列的长度和询问的个数. 第二行包含 NN 个整数(记为 a_ia​i​​),依次表示数列的第 ii 项. 接下来 MM行,每行包含两个整数 l_i, r_il​i​​,r​i​​,表示…
$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]$平…
ST表本身是不可修改的. 如果考虑增加一个数,可以把ST表反过来写,即f[i][j]表示i往前1<<j个数,一个数最多影响logn个数,常数非常小. #include<iostream> #include<cstdio> #include<cmath> using namespace std; ; typedef long long ll; inline ll rd(){ ll ret=,f=;char c; :; +c-',c=getchar(); ret…
我太菜了 今天才学会现场脑补ST表静态RMQ #include<iostream> #include<cstdio> #include<algorithm> #include<cmath> #include<cstdlib> #include<cstring> #include<queue> #include<map> #include<vector> #define ll long long #d…
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…
考试yy二维ST表失败导致爆零. 其实和一维的ST表很像... 也是设$f[i][j][p][q]$为以$(i, j)$为左上角,长为$2^p$,宽为$2^q$的矩形的最大值. 算法流程是先把每一行都分别求一遍一维的ST表,然后再把行与行之间合并... 查询和一维ST表类似 #include <iostream> #include <cstdio> #include <cstring> #include <cmath> #include <algori…
ST表是用来求RMQ问题(求区间最大或最小值问题)的实用数据结构,支持\(O(nlog_n)\)建立,\(O(1)\)查询,是比较高效的结构 其原理实质上是DP(我最讨厌的东西) 题面:屠龙宝刀... 这是一道ST表经典题--静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) 本题所需处理仔细琢磨琢磨就是DP,先完成范围小一些的任务,然后再进行状态转移 转移方程(就是完成左右两区间处理后合并): \(f_{i,j}=max(f_{i,j-1},…
题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1) O(1) 题目描述 给定一个长度为 N N 的数列,和 M M 次询问,求出每一次询问的区间内数字的最大值. 输入输出格式 输入格式: 第一行包含两个整数 N, M N,M ,分别表示数列的长度和询问的个数. 第二行包含 N 个整数,依次表示数列的第 i 项. 接下来 M 行,每行包含两个整数 表示查询的区间 输出格式: 输出包含 M M 行,每行一个整数,依…
P1816 忠诚 题目描述 老管家是一个聪明能干的人.他为财主工作了整整10年,财主为了让自已账目更加清楚.要求管家每天记k次账,由于 管家聪明能干,因而管家总是让财主十分满意.但是由于一些人的挑拨,财主还是对管家产生了怀疑.于是他决定用一种特别的方法来判断管家的忠诚,他把每次的 账目按1,2,3…编号,然后不定时的问管家问题,问题是这样的:在a到b号账中最少的一笔是多少?为了让管家没时间作假他总是一次问多个问题. 输入输出格式 输入格式: 输入中第一行有两个数m,n表示有m(m<=100000…
题意:给你一组数,询问\(q\)次,问所给区间内的最大值和最小值的差. 题解:经典RMQ问题,用st表维护两个数组分别记录最大值和最小值然后直接查询输出就好了 代码: int n,q; int a[N]; int dp1[N][30],dp2[N][30]; int lg[N]; void lg_Init(){ for(int i=1;i<=n;++i){ int k=0; while(1<<(k+1)<=i) k++; lg[i]=k; } } void RMQ_Init1(){…
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;…