ST表入门

ST表简介

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

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

如何构建和查询 S T ST ST

构建 S T ST ST表:

初始化:

当区间长度为 1 1 1时,即 f i , 0 f_{i,0} fi,0,其值为数组中对应的元素 a i a_i ai

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

状态态转移方程:

f i j = m a x ( f i , j − 1 , f i + 2 ( j − 1 ) , j − 1 ) f_{ij} = max(f_{i,j-1}, f_{i+2^(j-1),j-1}) fij=max(fi,j1,fi+2(j1),j1),即将长度为 2 j 2^j 2j的区间分成两个长度为 2 ( j − 1 ) 2^{(j-1)} 2(j1)的区间,取这两个区间的最大值。

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 ] [l, r] [l,r],首先计算出一个整数 k k k,使得 2 k 2^k 2k尽可能接近但不超过 r − l + 1 r-l+1 rl+1,即 k = l o g 2 ( r − l + 1 ) k = log_2(r-l+1) k=log2(rl+1)。 然后查询两个子区间 [ l , l + 2 k − 1 ] [l, l+2^k-1] [l,l+2k1] [ r − 2 k + 1 , r ] [r-2^k+1, r] [r2k+1,r]的最大值,即 m a x ( l , r ) = m a x ( f l , k , f r − 2 k + 1 , k ) max(l, r) = max(f_{l,k}, f_{r-2^k+1,k}) max(l,r)=max(fl,k,fr2k+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]);
}

int main()
{

	return 0;
}

完结撒花 🎉🎉

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值