博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
初识 ST 表
阅读量:7289 次
发布时间:2019-06-30

本文共 1368 字,大约阅读时间需要 4 分钟。

推荐博客 : https://blog.csdn.net/BerryKanry/article/details/70177006

ST表通常用于RMQ问题中,询问某个区间的最值这类问题中

ST表的核心部分就是 st[i][j] ,表示以 i 为起点跳跃 2^j 所经路径的最值。

更新的时候利用dp的思想

代码示例 :

void init(){    LOG[0] = -1;    for(int i = 1; i <= 100000; i++) LOG[i] = LOG[i/2]+1;        for(int i = 1; i <= LOG[n]; i++){        for(int j = 1; j+(1<
<= n; j++){ st[j][i] = max(st[j][i-1], st[j+(1<<(i-1))][i-1]); } }}

 至于查询是可以O(1)实现的

 

int ans = max(st[a][k], st[b-(1<

 

还有关于求每个数的对数的LOG数组也是个重点,在上面

int st[maxn][20]; // 最大值为例int n;int LOG[maxn];void init(){    LOG[0] = -1;    for(int i = 1; i <= 100000; i++) LOG[i] = LOG[i/2]+1;        for(int i = 1; i <= LOG[n]; i++){        for(int j = 1; j+(1<
<= n; j++){ st[j][i] = max(st[j][i-1], st[j+(1<<(i-1))][i-1]); } }}int main() { //freopen("in.txt", "r", stdin); //freopen("out.txt", "w", stdout); cin >> n; for(int i = 1; i <= n; i++){ scanf("%d", &st[i][0]); } init(); //for(int i = 1; i <= n; i++){ //for(int j = 0; j <= LOG[n]; j++){ //printf("%d ", st[i][j]); //} //printf("\n"); //} int m, a, b; // m个查询 cin >> m; for(int i = 1; i <= m; i++){ scanf("%d%d", &a, &b); int k = LOG[b-a+1] int ans = max(st[a][k], st[b-(1<

 

转载于:https://www.cnblogs.com/ccut-ry/p/8762591.html

你可能感兴趣的文章
我的友情链接
查看>>
vFrank考VCDX的过程
查看>>
jQuery input同步发sims
查看>>
memcached起步
查看>>
lesson 10-你所不知道的邮件退信代码
查看>>
OSPF LSA过滤简述
查看>>
m283-tftp传输,nfs挂载rootfs
查看>>
Windows Server 2008搭建***服务
查看>>
实验一 路由配置(cisco packet tracer)
查看>>
装机流程
查看>>
练习题7
查看>>
简单的nginx启动脚本
查看>>
我的友情链接
查看>>
React Native集成到Android项目当中
查看>>
cd ls
查看>>
linux学习命令总结⑩①
查看>>
【好程序员笔记分享】C语言之交换变量的值
查看>>
linux 安装和初级优化
查看>>
C#系列-多样化的程序分支[7]
查看>>
Keepalived配置文件详解(以Haproxy作为负载均衡器)
查看>>