ST表总结

Posted Harris-H

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了ST表总结相关的知识,希望对你有一定的参考价值。

ST表总结

ST表是用来解决可重复贡献的数据结构。

在这里插入图片描述


原理

基于倍增的思想。

在这里插入图片描述

在这里插入图片描述


RMQ模板

void init(int n){
	for(int i=2;i<N;i++)	//预处理log函数,实现O(1)询问
		b[i]=b[i/2]+1;
	for(int j=1;j<=b[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]);
}
int main(){
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++) scanf("%d",&f[i][0]);
	init(n);
	while(q--){
		int l,r;scanf("%d%d",&l,&r);
		int x=b[r-l+1];
		printf("%d\\n",max(f[l][x],f[r-(1<<x)+1][x]));
	}
	return 0;
}

ST表的应用

在这里插入图片描述

区间最值、区间GCD、区间按位与、区间按位或。


优缺点

在这里插入图片描述

不支持修改,维护信息有限。


二维ST表

  • 一般是维护正方形的最值

f [ i ] [ j ] [ k ] f[i][j][k] f[i][j][k]表示以 ( i , j ) (i,j) (i,j)为左上角边长为 2 k 2^k 2k的矩形的最大值。

有递推式: f i , j , k = max ⁡ { f i , j , k − 1 , f i + 2 k − 1 , j , k − 1 , f i , j + 2 k − 1 , k − 1 , f i + 2 k − 1 , j + 2 k − 1 , k − 1 } \\large f_{i,j,k}=\\max\\{f_{i,j,k-1},f_{i+2^{k-1},j,k-1},f_{i,j+2^{k-1},k-1},f_{i+2^{k-1},j+2^{k-1},k-1}\\} fi,j,k=max{fi,j,k1,fi+2k1,j,k1,fi,j+2k1,k1,fi+2k1,j+2k1,k1}

void init(){
	for(int k=1;k<=g;k++)
		for(int x=1;x+(1<<k)-1<=A;x++)
			for(int y=1;y+(1<<k)-1<=B;y++)
		{
	f[x][y][1]=max({f[x][y][1],f[x+(1<<k-1)][y+(1<<k-1)][1],f[x+(1<<k-1)][y][1],f[x][y+(1<<k-1)][1]});
	f[x][y][0]=min({f[x][y][0],f[x+(1<<k-1)][y+(1<<k-1)][0],f[x+(1<<k-1)][y][0],f[x][y+(1<<k-1)][0]});
		//printf("%d %d\\n",f[x][y][1],f[x][y][0]);
		}
}

若题目求固定边长 n n n的最值,则可以省去第三维,递推到 2 k + 1 ≥ n 2^{k+1}\\ge n 2k+1n即可。


以上是关于ST表总结的主要内容,如果未能解决你的问题,请参考以下文章

刷题总结——Bob's Race(hdu4123 树形dp+st表)

[总结]RMQ问题&ST算法

ST表学习

19 01 11 javascript ?????????????????????(???????????????) ??????????????????????????????(代码片段

python常用代码片段总结

BootStrap有用代码片段(持续总结)