——深深感谢你——|

_yolanda

园龄:3年7个月粉丝:11关注:15

2022-02-15 14:41阅读: 175评论: 0推荐: 0

ST表(倍增表)

介绍 st表 之前先看看 RMQ 问题是什么东西吧

RMQ

RMQ : Range Maximum/minimum Query

顾名思义,这就是指区间最大或最小值(区间最值)

ST表

ST表:Spars Table,一种可以解决 RMQ 的,基于 倍增 的数据结构


f[i][j] 表示从 i 开始连续 2j 个数中的最值,如果 i 后面的数不足 2j 个则全取

转移方程:

f[i][j]={min/max(f[i][j1],f[i+2j1][j1]),j>0,i+2j1nf[i][j1],j>0,i+2j1>na[i],j=0

  • f 数组可以递推得到

代码:

int x=log(n)/log(2);
for(int j=1;j<=x;j++)
for(int i=1;i<=n-(1<<j)+1;i++)
f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);

时间复杂度: O(nlog(n))


询问方式:

询问区间为 [l,r] ,设 x=log2(lr+1) ,则区间 [l,l+2x1] 和 区间 [r2x+1,r] 一定覆盖了 [l,r] 这个区间内所有元素

所以答案为: min(f[l][x],f[r2x1][x])

小优化:对于 1 ~ n 每一个数先预处理 log(x) 下取整的结果,每次讯问时即为 O(1) 的复杂度

代码:

lg[0]=-1;
for(int i=1;i<=n;i++) lg[i]=lg[i/2]+1;
for(int i=1;i<=m;i++){
int le,r;
scanf("%d%d",&le,&r);
int x=r-le+1;
printf("%d\n",max(f[le][lg[x]],f[r-(1<<lg[x])+1][lg[x]]));
}

几道练手题:

  1. 模板题
  2. 另一道模板题 (貌似树状数组和线段树也能做)

需要思考一下的题:

  1. 序列
  2. Foutain

本文作者:_yolanda

本文链接:https://www.cnblogs.com/yolanda-yxr/p/15896448.html

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

posted @   _yolanda  阅读(175)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示
评论
收藏
关注
推荐
深色
回顶
收起
  1. 1 化身孤岛的鲸 周深
  2. 2 像鸟儿一样(Live) 周深
  3. 3 Rubia 周深
  4. 4 痕迹 周深
像鸟儿一样(Live) - 周深
00:00 / 00:00
An audio error has occurred, player will skip forward in 2 seconds.

像鸟儿一样 (Live) - 周深

词:陈曦

曲:陈曦

像鸟儿一样

像鸟儿一样

飞过月光海港

飞过月光海港

看过山色极光

看过山色极光

听过雨露悲伤

听过雨露悲伤

像鸟儿一样

像鸟儿一样

路过银河星光

路过银河星光

错过烟花绽放

错过烟花绽放

尝过失措惊慌

像鸟儿一样

像鸟儿一样

记得家的方向

记得家的方向

认得人的模样

认得人的模样

却忘了飞不过时光

像鸟儿一样

像鸟儿一样

活得匆匆忙忙

活得匆匆忙忙

爱得两两相望

爱得两两相望

却不知终将天各一方

多想像鸟儿一样扇动翅膀

多想像鸟儿一样扇动翅膀

展开对天空的想象

心怀梦想

心怀梦想

借着太阳的光芒 风的力量

多想像鸟儿一样目视前方

多想像鸟儿一样目视前方

拥抱这命运的无常

满怀期望

凭着自己的臂膀

像鸟儿一样

像鸟儿一样

记得家的方向

认得人的模样

认得人的模样

却忘了飞不过时光

却忘了飞不过时光

像鸟儿一样

像鸟儿一样

活得匆匆忙忙

活得匆匆忙忙

爱得两两相望

爱得两两相望

却不知终将天各一方

多想像鸟儿一样扇动翅膀

多想像鸟儿一样扇动翅膀

展开对天空的想象

心怀梦想

心怀梦想

借着太阳的光芒 风的力量

多想像鸟儿一样目视前方

多想像鸟儿一样目视前方

拥抱这命运的无常

满怀期望

凭着自己的臂膀 风的力量

多么向前方

多么向前方

拥抱这命运的无常

满怀期望

满怀期望

凭着自己的臂膀梦的力量

凭着自己的臂膀梦的力量