倍增算法学习指南
前置芝士
倍增思想
ST表
(Sparse Table,稀疏表)是一种简单的数据结构,解决RMQ(区间最大/最小值查询)问题。主要应用倍增思想。O(NlogN)的预处理,O(1)的查询。ST 表是用于解决 可重复贡献问题 的数据结构。
[预处理ST表]
倍增法递推:用两个等长小区间拼凑一个大区间。
f[i][j]表示以第i个数为起点,长度为的区间中的最大值,先算出并存
公式:
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])
[区间查询最值]
对查询区间做分割,并拼凑区间长度指数
公式:
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 中国大陆许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步