前置芝士
倍增思想
ST表
(Sparse Table,稀疏表)是一种简单的数据结构,解决RMQ(区间最大/最小值查询)问题。主要应用倍增思想。O(NlogN)的预处理,O(1)的查询。ST 表是用于解决 可重复贡献问题 的数据结构。
[预处理ST表]
倍增法递推:用两个等长小区间拼凑一个大区间。
f[i][j]表示以第i个数为起点,长度为\(2^j\)的区间中的最大值,先算出并存\(maxi∈[i,i+2^j)\)
公式:\(f[i][j]=max(f[i][j-1],f[i+2^{j-1}][j-1])\)
int f[MAXN][21];//第二维的大小根据数据范围决定,不小于log(MAXN)
for(int i=1;i<=n;i++) cin>>f[i][0];
for(int j=1;j<=20;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])
[区间查询最值]
对查询区间\([l,r]\)做分割,并拼凑区间长度指数\(k=log_2(r-l+1)\)
公式:\(max([l,r])=max(f[l][k],f[r-2^k+1][k])\)
for(int i=2;i<=n;i++) log2[i]=log2[i/2]+1;//预处理log2
int k=log2[r-l+1];
int res=max(f[l][k],f[r-(1<<k)+1][k]);
可重复贡献问题?????
标签:学习指南,查询,int,max,ST,算法,区间,倍增 From: https://www.cnblogs.com/taotao123456/p/17809613.html