倍增算法学习指南

前置芝士

倍增思想

ST表

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

[预处理ST表]

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

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

img

公式:f[i][j]=max(f[i][j1],f[i+2j1][j1])

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=log2(rl+1)

img

img

公式:max([l,r])=max(f[l][k],f[r2k+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]);

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

本文作者:White_Sheep

本文链接:https://www.cnblogs.com/taotao123456/p/17809613.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

posted @   White_Sheep  阅读(41)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
💬
评论
📌
收藏
💗
关注
👍
推荐
🚀
回顶
收起
🔑