St表。

学习笔记二

St表

众嗦粥汁,当提到区间维护时我们想到的绝对是线段树,树状数组,st表,其中线段树是绝对的万金油,但是对于区间最值的查询还是st表的神乎其神的O(1)最为膜拜,现在让我们开始吧。
St表有一点dp的意思,我们定义一个数组mn[i][j],它里面存的是从j到j+2^i-1 的最值(这里以最大值为例),那么显然mn[i][j]的最值为前半段的最值和后半段的最值的max,mn[i][j]的长度是2^i, 所以一半的长度是2^(i-1), 那么我们就可以得到转移方程
mn[i][j]=max(mn[i-1][j],mn[i-1][j+2^(i-1)]);
既然这是一个类似于dp的东西,那我们肯定需要预处理,mn[0][i]就是原数组a[i]的值
这就是O(nlogn)复杂度的预处理。
然后就是O(1)复杂度的查询:我们知道一件事就是假如我们查询的区间是(x,y)那么我们定义g=y-x+1,所以2log(g)一定会比(x,y)的中点长,且比终点短,所以我们可以令这一段的最值是x往前2log(g)和y往后2^log(g)最大值,由此我们可以得到转移方程
Maxn=max(mn[log(g)][x],mn[log(g)][y-2^log(g)+1])
是不是对于log看的有一点迷瞪,其实这里的log(x)是指小于等于x的2的最大多少次幂,所以我们就可以得出刚才的一系列结论,那么2^log(y-x+1)一定是离y最近的一个
下面的就是log的预处理

llog[0]=-1;
for(int i=1;i<=n+1;i++){
	llog[i]=llog[i/2]+1;//表示小于等于i的2的多少次幂     比如llog【3】=1 
}

至于模板吗,大家在网上自己找啦,这个还是要找自己可以看的下去的代码吗,ok有什么问题欢迎提问,下一篇博客见!!
补充下在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值