模板 - 数据结构 - ST表/SparseTable】的更多相关文章

SparseTable,俗称ST表,其功能,就是静态的RMQ(区间最值查询)问题的解决.注意传入查询的时候两个参数的合法性,或者可以进行一次全部初始化来使得越界值不产生负面影响.不过访问越界是写程序的不良习惯,不应该指望进行一次额外的初始化把它消除.再重申一次对任何位置的访问都要保证不越界.有一些加了某个值之后就会越界.既然是模板那就写多两行预防以后的问题吧(比如某个整除分块也有类似的隐藏bug).实际应用的时候可以删除提高性能. 时间复杂度: 初始化1:O(MAXN) 初始化2:O(nlogn…
区间最大值,$O(nlogn)$ 预处理,$O(1)$ 查询,不能动态修改.在查询次数M显著大于元素数量N的时候看得出差距. 令 $f[i][j]$ 表示 $[i,i+2^j-1]$ 的最大值. 显然, $f[i][0]=a[i]$ . 根据定义式,写出状态转移方程: $f[i][j]=max(f[i][j-1],f[i+2^{j-1}][j-1])$ . 我们可以这么理解:将区间 $[i,i+2^j-1]$ 分成相同的两部分 中点即为 $(i+(i+2^j-1))/2=i+2^{j-1}-1/…
P3865 [模板]ST表 https://www.luogu.org/problemnew/show/P3865 题目背景 这是一道ST表经典题——静态区间最大值 请注意最大数据时限只有0.8s,数据强度不低,请务必保证你的每次查询复杂度为 O(1)O(1) 题目描述 给定一个长度为 NN 的数列,和 MM 次询问,求出每一次询问的区间内数字的最大值. 输入输出格式 输入格式: 第一行包含两个整数 N, MN,M ,分别表示数列的长度和询问的个数. 第二行包含 NN 个整数(记为 a_iai​…
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行,每行一…
数据结构-ST表 不可修改,在线查询的 RMQ 问题. 其中 \(f[i][j]\) 表示 \(i\sim i+(1<<j)-1\) 这段的 RMQ 值. 时间复杂度 \(O(n\log n)\) #include <bits/stdc++.h> using namespace std; const int N=1e5+10; namespace ST{ class St{ public: int f[N][30]; }st; void build(St&t,int n,i…
给定一个长度为 \(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…
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…
题目链接 本来准备自己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();…
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…