关于st表的推导
#include <bits/stdc++.h> using namespace std;
const int maxn=1e6+7;
int st[maxn][32];
int a[maxn],n;
void init(){
int i,j;
//st[i][j]表示i到i+2^j-1区间的最小值
//先预处理区间长度为1的
for(i=0;i<n;++i) st[i][0]=a[i];
for(i=0;i<n;++i){
for(j=1;i+2^(j)-1<n;++j){
//i~i+2^(j-1)-1
//i+2^(j-1)~i+2^(j-1)+2^(j-1)-1=>i+2^j-1;
//一定要发现这个显然的事实就是
//2^(j-1)+2^(j-1)=2^j;
st[i][j]=min(s[i][j-1],s[i+2^(j-1)][j-1]);
}
}
}
int queryMin(int l,int r){
int len=r-1+1;
int index=log(len);
//st[l][index] l~l+2^(index)-1
//2^(index)<=(r-l+1); l+2^(index)-1<=r
//r-(l+2^(index)-1)>=0 还差多少元素没放进来
//x+LEN=l+2^(index)-1+(r-(l+2^(index)-1));
//x+2^(index)-1=r;//区间长度固定。。起点是多少才能正好跑到r,列一个简单的方程才能解决
//x=r+1-(2^(index));
return min(st[l][index],st[r+1-(2^(index))][index]);
}
int main(){
while(~scanf("%d",&n)){
int i,q,l,r;
for(i=0;i<n;++i){
scanf("%d",a+i);
}
init();
scanf("%d",&q);
for(i=0;i<q;++i){
scanf("%d%d",&l,&r);
printf("%d\n",query(l,r));
}
}
return 0;
}
上面这个^符号代表幂次。。而c++里只有异或。。这就是为什么这是一个伪代码的意思
先来一个终极伪代码
推导过程如上。。
下面给一个真正的的代码
#include <bits/stdc++.h> using namespace std;
const int maxn=1e6+7;
int st[maxn][32];
int a[maxn],n;
void init(){
int i,j;
//st[i][j]表示i到i+2^j-1区间的最小值
//先预处理区间长度为1的
for(i=0;i<n;++i) st[i][0]=a[i];
for(i=0;i<n;++i){
for(j=1;i+(1<<j)-1<n;++j){//这里有一个优化。。本来是小于32的。。问题规模较小是只是相当于一个常数的优化
//i~i+2^(j-1)-1
//i+2^(j-1)~i+2^(j-1)+2^(j-1)-1=>i+2^j-1;
//一定要发现这个显然的事实就是
//2^(j-1)+2^(j-1)=2^j;
st[i][j]=min(st[i][j-1],st[i+(1<<(j-1))][j-1]);
}
}
}
int queryMin(int l,int r){
int k=log(r-l+1);
//st[l][index] l~l+2^(index)-1
//2^(index)<=(r-l+1); l+2^(index)-1<=r
//r-(l+2^(index)-1)>=0 还差多少元素没放进来
//x+LEN=l+2^(index)-1+(r-(l+2^(index)-1));
//x+2^(index)-1=r;//区间长度固定。。起点是多少才能正好跑到r,列一个简单的方程才能解决
//x=r+1-(2^(index));
return min(st[l][k],st[r+1-(1<<k)][k]);
}
int main(){
while(~scanf("%d",&n)){
int i,q,l,r;
for(i=0;i<n;++i){
scanf("%d",a+i);
}
init();
scanf("%d",&q);
for(i=0;i<q;++i){
scanf("%d%d",&l,&r);
printf("%d\n",queryMin(l-1,r-1));
}
}
return 0;
}
还有一个对于新手来说理解的坑。。那就是int x=log(val)实际上是对log的值向下取整。。这一点非常重要
只有这个成立我们注释里的推导才会成立。。另外有一些没用的推导。。但是我没有删掉。。这是因为想记录一下我全部的思考过程
关于st表的推导的更多相关文章
- ST表学习总结
前段时间做16年多校联合赛的Contest 1的D题(HDU 5726)时候遇到了多次查询指定区间的gcd值的问题,疑惑于用什么样的方式进行处理,最后上网查到了ST表,开始弄得晕头转向,后来才慢慢找到 ...
- P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表
P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...
- POJ3693 Maximum repetition substring [后缀数组 ST表]
Maximum repetition substring Time Limit: 1000MS Memory Limit: 65536K Total Submissions: 9458 Acc ...
- 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)
2006: [NOI2010]超级钢琴 Time Limit: 20 Sec Memory Limit: 552 MBSubmit: 2473 Solved: 1211[Submit][Statu ...
- 【BZOJ-3956】Count ST表 + 单调栈
3956: Count Time Limit: 10 Sec Memory Limit: 512 MBSubmit: 173 Solved: 99[Submit][Status][Discuss] ...
- 【BZOJ-4569】萌萌哒 ST表 + 并查集
4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec Memory Limit: 256 MBSubmit: 459 Solved: 209[Submit][Status] ...
- 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分
4310: 跳蚤 Time Limit: 20 Sec Memory Limit: 512 MBSubmit: 180 Solved: 83[Submit][Status][Discuss] De ...
- HDU5726 GCD(二分 + ST表)
题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence of N(N≤100, ...
- Hdu 5289-Assignment 贪心,ST表
题目: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others) ...
随机推荐
- Flask之静态文件处理
静态文件的处理 推荐 from flask import Flask,render_template app = Flask(__name__,template_folder='templates', ...
- canvas星空背景特效+CSS旋转相册学习
今天在看帖子的时候,看到了个有趣的css旋转相册,刚好之前做了一个星空背景dome,这里给大家分享下代码: 旋转相册参考:https://blog.csdn.net/gitchatxiaomi/art ...
- JSAAS BPM快速开发平台-企业管理软件,专属你的企业管家
前言: 2020年,企业该如何去选择合适的信息化规划管理软件,基于目前社会软件杂乱无章,选择企业业务贴近的管理软件,甚是困难,市场上一些大品牌公司的产品,定位高,价格高,扩展难,等等一系列的问题,对于 ...
- Kubernetes调整Node节点快速驱逐pod的时间
在高可用的k8s集群中,当Node节点挂掉,kubelet无法提供工作的时候,pod将会自动调度到其他的节点上去,而调度到节点上的时间需要我们慎重考量,因为它决定了生产的稳定性.可靠性,更快的迁移可以 ...
- 深度学习论文翻译解析(十七):MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications
论文标题:MobileNets: Efficient Convolutional Neural Networks for Mobile Vision Applications 论文作者:Andrew ...
- thinkphp如何实现伪静态
去掉 URL 中的 index.php ThinkPHP 作为 PHP 框架,是单一入口的,那么其原始的 URL 便不是那么友好.但 ThinkPHP 提供了各种机制来定制需要的 URL 格式,配合 ...
- 抛弃 .NET 经典错误:object null reference , 使用安全扩展方法? 希望对大家有帮助---Bitter.Frame 引用类型的安全转换
还是一样,我不喜欢长篇大论,除非关乎我设计思想领域的文章.大家过来看,都是想节省时间,能用白话表达的内容,绝不长篇大论.能直接上核心代码的,绝不上混淆代码. 长期从事 .NET 工作的人都知道..NE ...
- Linux kernel 同步机制
Linux kernel同步机制(上篇) https://mp.weixin.qq.com/s/mosYi_W-Rp1-HgdtxUqSEgLinux kernel 同步机制(下篇) https:// ...
- 一、JavaScript实现AJAX(只需四步)
-----------------------------------------------一.JavaScript实现AJAX(只需四步)----------------------------- ...
- NATAPP--实现SSH内网穿透
NATAPP--实现SSH内网穿透 1. 关于Natapp 2. 使用Natapp 3. Natapp安装和配置 4. XShell连接 相关参考博文原文地址: CSDN:KevenPotter:NA ...