倍增算法学习指南

前置芝士

倍增思想

ST表

(Sparse Table,稀疏表)是一种简单的数据结构,解决RMQ(区间最大/最小值查询)问题。主要应用倍增思想。O(NlogN)的预处理,O(1)的查询。ST 表是用于解决 可重复贡献问题 的数据结构。

[预处理ST表]

倍增法递推:用两个等长小区间拼凑一个大区间。

f[i][j]表示以第i个数为起点,长度为\(2^j\)的区间中的最大值,先算出并存\(maxi∈[i,i+2^j)\)

img

公式:\(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)\)

img

img

公式:\(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]);

可重复贡献问题?????

posted @ 2023-11-04 17:48  White_Sheep  阅读(37)  评论(0编辑  收藏  举报