Java教程

ST表总结

本文主要是介绍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,k−1​,fi+2k−1,j,k−1​,fi,j+2k−1,k−1​,fi+2k−1,j+2k−1,k−1​}

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+1≥n即可。


这篇关于ST表总结的文章就介绍到这儿,希望我们推荐的文章对大家有所帮助,也希望大家多多支持为之网!