首页 > 其他分享 >ST 表

ST 表

时间:2024-08-23 21:37:30浏览次数:9  
标签:RMQ Log int max ST logn

ST 表

ST 表,主要思想是空间换时间,用于解决可重复贡献问题和 RMQ 问题。

可重复贡献问题

指某个运算 \(op\),有 \(x\ op\ x\ =\ x\) 。例如 \(max(x,x)=x\ \ min(x,x)=x\ \ gcd(x,x)=x\)。

RMQ 问题

指在区间内的最大/最小值查询。

ST 表

ST 表基于倍增的思想,做到 \(O(n \log n)\) 的预处理时间,\(O(1)\) 的查询时间。副作用是不支持修改操作。

而 ST 表的实现类似于 dp,设 \(f_{i,j}\) 表示区间 \([i,i+2^j-1]\) 的最大值。

而显然 \(f_{i,0}=a_i\)​。

为什么是 \(i+2^j-1\) 而不是 \(i+2^j\) 呢?

因为很巧,如果 \(j=0\),则 \(2^0=1\),得再减个一。

那么第二维的意思也就是在倍增的时候,调了 \(2^j-1\) 步。

那么状态转移方程:

\[f_{i,j}=max(f_{i,j-1},f_{i+2_{j-1},j-1}) \]

可以基于下面这张图(神图)来理解。

对于每个询问 \([l,r]\),可以分成两部分,分别是 \([l,l+2^s-1],[r-2^s+1,r]\)。

而 \(s=log_2^{r-l+1}\)。

模板代码

例题:P3865 【模板】ST 表 && RMQ 问题

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5,logn=21;
int n,m,f[N][logn],Log[N],x,y,s;
inline void init()
{	
	Log[1]=0;
	Log[2]=1;
	for(int i=3;i<N;i++)
		Log[i]=Log[i/2]+1;
	for(int j=1;j<=logn;j++)
		for(int i=1;i+(1<<j)-1<=n;i++)
			f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
	return;	
}
int main(){
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)
		scanf("%d",&f[i][0]);
	init();
	while(m--)
	{
		scanf("%d%d",&x,&y);
		s=Log[y-x+1];
		printf("%d\n",max(f[x][s],f[y-(1<<s)+1][s]));
	}
	return 0;
}

标签:RMQ,Log,int,max,ST,logn
From: https://www.cnblogs.com/Atserckcn/p/18377124

相关文章

  • 一文讲清楚static关键字
    static能修饰的地方静态变量静态变量:又称为类变量,也就是说这个变量属于类的,类所有的实例都共享静态变量,可以直接通过类名来访问它;静态变量在内存中只存在一份。实例变量:每创建一个实例就会产生一个实例变量,它与该实例同生共死。静态方法静态方法在类加载的时候就......
  • STM32寄存器操作、模板构建
    目录外设寄存器查找①名称②偏移地址③寄存器位表④位功能说明寄存器基本操作C语言的置位和清零具体方法设置GPIO流程给寄存器赋值带参数宏STM32F1xx芯片识别存储器映射寄存器映射让GPIOB端口的16个引脚输出高电平,要怎么实现?STM32寄存器映射C语言对寄存器的封装新建寄......
  • CF1514D Cut and Stick 题解
    题目传送门前置知识可持久化线段树解法若区间内不存在绝对众数,直接保持这一段即可。若存在绝对众数,贪心地想肯定要尽可能地把其分开还要限制出其他数使其不成为绝对众数。容易发现设绝对众数出现次数为\(cnt\),取\(cnt-1\)个其他数和绝对众数配对最优。但可能其他数不够\(......
  • 利用子域的System权限通往父域
    前言最近翻阅笔记发现一篇文章提到通过子域的System权限可以突破获取到父域权限,本文将对此技术进行尝试复现研究。利用分析环境信息:子域:187、sub.cs.org父域:197、cs.org首先通过在子域的域控机器上打开mmc.exe->连接ADSI->配置来查看子域的配置命名上下文:从配置中可以看......
  • AtCoder Beginner Contest 050
    基本上独立做出来了。A-AdditionandSubtractionEasy模拟。#include<bits/stdc++.h>usingnamespacestd;usingi64=longlong;intmain(){ ios::sync_with_stdio(false),cin.tie(nullptr); intA,B; charC; cin>>A>>C>>B; if(C==......
  • WPF ystem.Windows.Markup.XamlParseException HResult=0x80131501 Message='Spec
    System.Windows.Markup.XamlParseExceptionHResult=0x80131501Message='Specifiedclassname'WpfApp268.MainWindow'doesn'tmatchactualrootinstancetype'System.Windows.Window'.RemovetheClassdirectiveorprovideanin......
  • ArrayList动态扩容机制(长度可变原理)
    ArrayList底层是数组结构的,数组的默认长度为10。当数组添加满了后,会自动扩容为1.5倍。原理讲解:1.用空参构造函数创建ArrayList集合容器。测试代码:publicclassArrayListDemo{publicstaticvoidmain(String[]args){//创建ArrayList集合容器......
  • P2419 Cow Contest S
    挺有意思的,记一下。P2419CowContestS题目大意:有\(n(n\le100)\)个数,告诉你\(m\)条某两个数的大小关系,问你有多少数的排名是可以确定的(保证不会冲突)。题目思路:首先,我们肯定是可以直接拓扑,那就是变成了问你拓扑时有多少数是单独一层的(本次只有它这一个数入队),但是我们还有......
  • 【C++基础】static、const在类中的应用
    目录static一、修饰的变量或函数类型1.修饰全局变量2.修饰局部变量1.通过函数访问2.通过类的静态成员3.修饰函数4.修饰类中的成员二、在类中的应用场景1.共享数据(跨对象共享状态)2.单例模式3.工具类或辅助函数4.类级别的常量5.计数器或标识符生成器6......
  • C++ STL源码个人学习与分析记录 ——空间配置器(allocator)
    STL源码个人学习与分析记录——空间配置器(allocator)1.为什么需要空间配置器?2.SGI-STL空间配置器的实现2.1一级空间配置器:malloc_alloc_template2.2二级空间配置器:default_alloc_template2.2.1.内存池技术2.2.2.自由链表(free-list)2.2.3Union2.3二级空间配置器的......