#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. Angular学习资料大全和常用语法汇总(让后端程序员轻松上手)

    前言: 首先为什么要写这样的一篇文章呢?主要是因为前段时间写过一些关于Angualr的相关实战文章,有些爱学习的小伙伴对这方面比较感兴趣,但是又不知道该怎么入手(因为认识我的大多数小伙伴都是后端的同学 ...

  2. SpringBoot 自动配置:Spring Data JPA

    前言 不知道从啥时候开始项目上就一直用MyBatis,其实我个人更新JPA些,因为JPA看起来OO的思想更强烈些,所以这才最近把JPA拿出来再看一看,使用起来也很简单,除了定义Entity实体外,声明 ...

  3. Vue基础之插值表达式的另一种用法!附加变量的监听!

    Vue基础之插值表达式的另一种用法!附加变量的监听! 讲这个之前我们先回顾一下原来的用法! <body> <!-- Vue.js的应用可以分为两个重要的组成部分 一个是视图! 另一个 ...

  4. elasticsearch从开始到永久

    0.学习目标 独立安装Elasticsearch 会使用Rest的API操作索引 会使用Rest的API查询数据 会使用Rest的API聚合数据 掌握Spring Data Elasticsearch ...

  5. innodb和myisam原理

    MyISAM索引实现 MyISAM引擎使用B+Tree作为索引结构,叶节点的data域存放的是数据记录的地址.如图:  这里设表一共有三列,假设我们以Col1为主键,则上图是一个MyISAM表的主索引 ...

  6. CSS 文本效果

         对于CSS文本的一些效果,基础一些的知识比较简单,但对于text-indent,vertical-align,text-align等的深入学习能够使我们对HTML5的学习更加轻松,对这部分知 ...

  7. windows下hash抓取的几种方式

    前提:在渗透测试过程中,对于windows系统的机器渗透需要注意hash的获取,其中hash分为LM-HASH与NTLM-HASH,在windows系统中,hash的默认存储位置为: C:\Windo ...

  8. 复制虚拟机,链接网络问题:没有找到合适的设备:没有找到可用于链接System eth0 的

    http://my.oschina.net/coolfire368/blog/292742 1./etc/udev/rules.d/70-persistent-net.rules 修改也成,修改时留下 ...

  9. Python开发桌面微型计算器

    开发Windows窗口需要用到tkinter库 所以上来的第一件事就是: import tkinter as t window = t.Tk()#创建了一个窗口 window.title('微型计算器 ...

  10. mysql高级day2

    Mysql高级-day02 1. Mysql的体系结构概览 整个MySQL Server由以下组成 Connection Pool : 连接池组件 Management Services & ...