算法笔记 - ST表

定义

st[ i,j ] 表示左端点为 i ,长为( 1<< j )的区间最值

原理

(1)构造:由于ST表表示的区间长度为2^j,可以分割成左右两部分,每个点为起点都有 O(logN) 个区间,预处理总时间、空间复杂度都为 O(NlogN)。
在这里插入图片描述
(2)查询:求任意区间的最值都可以按照下图拆分,注意这里的区间可能会出现互相覆盖的情况,所以ST表只适用于维护允许区间重叠的性质,复杂度O(1)
在这里插入图片描述

实现

区间最大值为例

int a[MAXN],mxv[MAXN][23];
int quemx(int l,int r)
{
	int k = log2(r - l + 1);
	return max(mxv[l][k], mxv[r - (1 << k) + 1][k]);
}
signed main()
{
	int n;cin>>n;
	rpp (i,n) cin>>a[i],mxv[i][0]=a[i];
	
	for(int j=1;(1<<j)<=n;++j)
		for(int i=1;i+(1<<j)-1<=n;++i)
			mxv[i][j] = max(mxv[i][j - 1], mxv[i + (1 << (j - 1))][j - 1]);

	return 0;
}
发布了145 篇原创文章 · 获赞 1 · 访问量 3128
展开阅读全文

没有更多推荐了,返回首页

©️2019 CSDN 皮肤主题: 游动-白 设计师: 上身试试

分享到微信朋友圈

×

扫一扫,手机浏览