ST表介绍

1. 简介

ST表是求解RMQ问题的一种算法, RMQ问题是 Range Maximum(Minimum) Query 的缩写, 意思是查询区间最大(最小)值

它使用倍增的思想和动态规划的原理, 优点是速度更快, 做到 O ( n log ⁡ n ) O(n \log n) O(nlogn)的预处理速度, O ( 1 ) O(1) O(1)的单次查询速度。

ST算法是一个离线算法, 是指使用它的前提是没有修改操作。用于解决"可重复贡献问题", 是指每个元素会对答案贡献多次, 像求最大最小值计算多次也不会有影响, 可以使用ST算法, 但比如求和这类问题就不能使用了

2. ST算法流程

2.1 预处理

a [ 1... n ] a[1...n] a[1...n]表示一组数据, 设 f [ i , j ] f[i, j] f[i,j]表示从 a [ i ] a[i] a[i] a [ i + 2 j − 1 ] a[i+2^j-1] a[i+2j1]范围内最大值, 也就是从 a [ i ] a[i] a[i]向后数 2 j 2^j 2j个数的最大值, 可以得到 f [ i ] [ 0 ] = a [ i ] f[i][0] = a[i] f[i][0]=a[i]
f [ i , j ] f[i, j] f[i,j]范围两部分, 每部分的长度为 2 j − 1 2^{j-1} 2j1, 可以得到状态转移方程: f [ i ] [ j ] = max ⁡ ( f [ i ] [ j − 1 ] , f [ i + 2 j − 1 ] [ j − 1 ] ) f[i][j] = \max(f[i][j-1], f[i+2^{j-1}][j-1]) f[i][j]=max(f[i][j1],f[i+2j1][j1])
参考代码(下标从1开始):

void build(){
	for(int i = 1;i <= n;i++){
		f[i][0] = a[i];
	}
	for(int j = 1;(1 << j) <= n;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]);
		}
	}
}

注意: 加减的优先级大于位运算

2.2 询问

假设要询问区间 [ l i , r i ] [l_i, r_i] [li,ri]的最大值, 则先求出最大的 x x x, 满足 2 x ≤ r i − l i + 1 2^x \leq r_i-l_i+1 2xrili+1, 那么区间 [ l i , r i ] = [ l i , l i + 2 x − 1 ] ⋃ [ r i − 2 x + 1 , r i ] [l_i, r_i] = [l_i, l_i+2^x-1] \bigcup [r_i-2^x+1, r_i] [li,ri]=[li,li+2x1][ri2x+1,ri]
两个区间元素个数都为 2 x 2^x 2x, 所以 [ l i , r i ] [l_i, r_i] [li,ri]的最大值为 max ⁡ ( f [ l i ] [ x ] , f [ r i − 2 x + 1 ] [ x ] ) \max(f[l_i][x], f[r_i-2^x+1][x]) max(f[li][x],f[ri2x+1][x]), 可以在 O ( 1 ) O(1) O(1)内计算出来。
两个区间有交集, 但是对于求区间最值没有影响, 这就是ST算法只适用于求区间最值的原因
参考代码:

int find(int l, int r){
	int k = log2(r - l + 1)	//要用到<cmath>头文件
	int ans = max(f[l][k], f[r - (1 << x) + 1][x]);
}

2.3 技巧

有一个小技巧(其实我老师不大支持):
c m a t h cmath cmath库中 l o g 2 log2 log2函数效率不高, 还可以用 O ( N ) O(N) O(N), 递推出 1 1 1~ n n n n n n种区间长度对应的 k k k值, 设 l o g [ d ] log[d] log[d]表示 ⌊ l o g 2 d ⌋ \lfloor log_2 d \rfloor log2d, 则 l o g [ d ] = l o g [ d 2 ] + 1 log[d] = log[\frac{d}{2}]+1 log[d]=log[2d]+1
参考代码:

log[0] = -1;
for(int i = 1;i <= n;i++){
	log[i] = log(i / 2) + 1;
}

3. 例题

01 序列
稍微思考就可以应用ST表

Kolekcjoner Bajtemonów 2
稍微难一点


感谢收看, 国庆快乐

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
ST7789是一款彩色TFT液晶控制驱动集成电路,通常用于小尺寸显示设备,如智能手、智能家居设备和嵌入式系统等。ST7789中文手册主要介绍了该芯片的功能、电气特性、接口定义、寄存器设置和使用方法等内容。 手册首先对ST7789芯片的特性进行了介绍。它支持最高240x320像素的分辨率,可以显示262,144种不同颜色,并且具有高亮度和清晰度。该芯片还支持SPI接口和I2C接口,以满足不同应用场景的需求。 接下来,手册详细描述了ST7789的引脚定义和电气特性。它包含了电源引脚、数据引脚、复位引脚和背光引脚等,通过这些引脚可以实现与其他硬件设备的连接和通信。同时,手册还提供了电气特性的参数,如工作电压范围、工作温度范围和功耗等。 在使用ST7789芯片时,开发者需要了解和配置寄存器的设置。手册中详细列出了ST7789的寄存器地址和寄存器功能,开发者可以通过对寄存器进行编程来实现不同的显示效果。例如,可以设置显示窗口的起始位置、传输数据的格式、背光的亮度和对比度等。 最后,手册还提供了ST7789的使用方法和建议。它介绍了初始化流程、数据传输的模式和时序要求。对于初次使用ST7789的开发者来说,手册还给出了一些常见问题的解答和调试技巧,以帮助他们更好地理解和使用ST7789。 总结来说,ST7789中文手册是一份非常重要的参考资料,它提供了关于ST7789芯片的详细信息和使用方法,对于开发者来说是非常有价值的。通过仔细阅读手册,开发者可以了解如何正确地配置和控制ST7789芯片,实现高质量的彩色显示效果。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值