ST表

简介

ST 表(Sparse Table,稀疏表)是用于解决 可重复贡献问题 的数据结构.

  • 可重复贡献问题是指对于运算 \(opt\) 满足 \(x \ opt\ x=x\) 则对应的区间询问就是一个可重复贡献问题.例如,最大值有 \(max(x,x)=x\) 有 \(gcd(x,x)=x\) 所以 RMQ 和区间 GCD 就是一个可重复贡献问题.像区间和就不具有这个性质,如果求区间和的时候采用的预处理区间重叠了,则会导致重叠部分被计算两次,这是我们所不愿意看到的.另外,\(opt\) 还必须满足结合律才能使用 ST 表求解.

算法思路

倍增预处理,然后强行用长为 \(2^{log(r-l+1)}\) 的两端来处理,因为贡献可重,所以可以这样 \(O(1)\) 查询

代码

P3865 【模板】ST 表 & RMQ 问题

#include<bits/stdc++.h>
using namespace std;

const int Maxn=1e5+10;
int bit[20],st[Maxn][22];
int n,m;

int main()
{
	cin>>n>>m;
	bit[0]=1;
	for(int i=1;i<=20;i++) bit[i]=2*bit[i-1];
	for(int i=1;i<=n;i++) scanf("%d",&st[i][0]);
	for(int j=1;j<=log2(n);j++)
		for(int i=1;i<=n;i++)
		{
			if(i+bit[j]-1>n) break;
			st[i][j]=max(st[i][j-1],st[i+bit[j-1]][j-1]);
		}
	for(int i=1;i<=m;i++)
	{
		int x,y;
		scanf("%d%d",&x,&y);
		int c=log2(y-x+1);
		printf("%d\n",max(st[x][c],st[y-bit[c]+1][c]));
	}
	return 0;
}
posted @ 2026-10-30 14:51  Rainesxiao  阅读(2)  评论(0)    收藏  举报