ST表入门

ST表简介

\(ST\)\((Sparse Table,\)稀疏表\()\)是一种用于高效处理区间查询的数据结构,主要用于解决可重复贡献问题,如区间最大值、最小值、最大公约数等。

\(ST\)表的核心思想是利用倍增的思想,通过预处理来快速计算出各个区间的最值。

如何构建和查询\(ST\)

构建\(ST\)表:

初始化:

当区间长度为\(1\)时,即\(f_{i,0}\),其值为数组中对应的元素\(a_i\)

code

for(int i=1; i<=n; i++)
{
	f[i][0] = f1[i][0] = a[i];
}

状态态转移方程:

\(f_{ij} = max(f_{i,j-1}, f_{i+2^(j-1),j-1})\),即将长度为\(2^j\)的区间分成两个长度为\(2^{(j-1)}\)的区间,取这两个区间的最大值。

code (以最大值为例)

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]);
	}
}

查询ST表:

对于查询区间\([l, r]\),首先计算出一个整数\(k\),使得\(2^k\)尽可能接近但不超过\(r-l+1\),即\(k = log_2(r-l+1)\)。 然后查询两个子区间\([l, l+2^k-1]\)\([r-2^k+1, r]\)的最大值,即\(max(l, r) = max(f_{l,k}, f_{r-2^k+1,k})\)

code


int ansmax (int l, int r)
{
	
	int k = Log[r - l + 1];
	return max (f[l][k] , f[r-(1<<k)+1][k]);
}

完整代码

#include<iostream>
#include<cstdio>
#include<cmath>
const int N = 1e5+5;
using namespace std;
int n,k,f[N][25],a[N],Log[N];


void init()
{
	Log[1] = 0;
	for(int i=2; i<=n+1; i++) Log[i] = Log[i/2] + 1;
	for(int i=1; i<=n; i++)
	{
		f[i][0] = f1[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]);
		}
	}
}

int ansmax (int l, int r)
{
	
	int k = Log[r - l + 1];
	return max (f[l][k] , f[r-(1<<k)+1][k]);Q
}

int main()
{

	return 0;
}

完结撒花 🎉🎉

posted @ 2025-08-04 21:33  #define_int_int  阅读(37)  评论(0)    收藏  举报