#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表的推导的更多相关文章

  1. ST表学习总结

    前段时间做16年多校联合赛的Contest 1的D题(HDU 5726)时候遇到了多次查询指定区间的gcd值的问题,疑惑于用什么样的方式进行处理,最后上网查到了ST表,开始弄得晕头转向,后来才慢慢找到 ...

  2. P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表

    P6087 [JSOI2015]送礼物 01分数规划+单调队列+ST表 题目背景 \(JYY\) 和 \(CX\) 的结婚纪念日即将到来,\(JYY\) 来到萌萌开的礼品店选购纪念礼物. 萌萌的礼品店 ...

  3. POJ3693 Maximum repetition substring [后缀数组 ST表]

    Maximum repetition substring Time Limit: 1000MS   Memory Limit: 65536K Total Submissions: 9458   Acc ...

  4. 【BZOJ-2006】超级钢琴 ST表 + 堆 (一类经典问题)

    2006: [NOI2010]超级钢琴 Time Limit: 20 Sec  Memory Limit: 552 MBSubmit: 2473  Solved: 1211[Submit][Statu ...

  5. 【BZOJ-3956】Count ST表 + 单调栈

    3956: Count Time Limit: 10 Sec  Memory Limit: 512 MBSubmit: 173  Solved: 99[Submit][Status][Discuss] ...

  6. 【BZOJ-4569】萌萌哒 ST表 + 并查集

    4569: [Scoi2016]萌萌哒 Time Limit: 10 Sec  Memory Limit: 256 MBSubmit: 459  Solved: 209[Submit][Status] ...

  7. 【BZOJ-4310】跳蚤 后缀数组 + ST表 + 二分

    4310: 跳蚤 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 180  Solved: 83[Submit][Status][Discuss] De ...

  8. HDU5726 GCD(二分 + ST表)

    题目 Source http://acm.hdu.edu.cn/showproblem.php?pid=5726 Description Give you a sequence of N(N≤100, ...

  9. Hdu 5289-Assignment 贪心,ST表

    题目: http://acm.hdu.edu.cn/showproblem.php?pid=5289 Assignment Time Limit: 4000/2000 MS (Java/Others) ...

随机推荐

  1. (数据科学学习手札104)Python+Dash快速web应用开发——回调交互篇(上)

    本文示例代码已上传至我的Github仓库https://github.com/CNFeffery/DataScienceStudyNotes 1 简介 这是我的系列教程Python+Dash快速web ...

  2. mybatis-plubs条件构造器中的方法所对应的sql语法

    [通用条件:] [比较大小: ( =, <>, >, >=, <, <= )] eq(R column, Object val); // 等价于 =,例: eq(& ...

  3. dotnet cli 5.0 新特性——dotnet tool search

    dotnet cli 5.0 新特性--dotnet tool search Intro .NET 5.0 SDK 的发布,给 dotnet cli 引入了一个新的特性,dotnet tool sea ...

  4. 初审blucms(入坑)

    作为一名初来乍到审计小白,从blueCMS入手再好不过了.通过对入门级的cms进行审计以及一个整体的框架和常见的漏洞学习,对个人而言是一次不错的学习经历.话不多说直接进入主题. 代码审计环境 Blue ...

  5. CentOS安装mysql、JDK、Tomcat部署环境

    1.1. 安装mysql-5.6 1.1.1. 检测系统内部有没有安装其他的mysql数据库 $ rpm -qa | grep mysql 1.1.2. 如果内部有需要先删除Mysql $ yum r ...

  6. MySQL如何加锁控制并发

    目录 前言 一.乐观锁 添加version字段 二.悲观锁 读锁 全表锁(LOCK TABLE 表 READ) 行锁(SELECT ... LOCK IN SHARE MODE) 写锁 全表锁(LOC ...

  7. Linux下pcstat安装踩坑教程

    首先安装golang 1.进入官方链接下载对应自己系统版本的Golang安装包:https://dl.google.com/go/go1.13.4.linux-amd64.tar.gz root@ub ...

  8. css选择器有哪些,选择器的权重的优先级

    选择器类型 1.ID #id 2.class .class 3.标签 p 4.通用 * 5.属性 [type="text"] 6.伪类 :hover 7.伪元素 ::first-l ...

  9. TCP介绍

    TCP协议,传输控制协议(英语:Transmission Control Protocol,缩写为 TCP)是一种面向连接的.可靠的.基于字节流的传输层通信协议,由IETF的RFC 793定义. TC ...

  10. Jenkins部署静态资源文件

    Jenkins部署静态资源文件 1.Jenkins部署静态资源文件 1.1 设置项目名称.参数(环境.分支)等 1.2 配置源码管理 1.3 配置构建参数 2.项目实战demo 2.1 demo1 部 ...