关于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) ...
随机推荐
- Java优先队列PriorityQueue的各种打开方式以及一些你不知道的细节
目录 Java优先队列PriorityQueue的各种打开方式以及一些你不知道的细节 优先队列的默认用法-从小到大排序 对String类用优先队列从大到小排序 通过自定义比较器对自定义的类进行从小到大 ...
- 使用Swagger2
一.Swagger2是什么? Swagger 是一个规范和完整的框架,用于生成.描述.调用和可视化 RESTful 风格的 Web 服务. 优点: 及时性 (接口变更后,能够及时准确地通知相关前后端开 ...
- ovs-fields
1. 字段匹配 精确匹配 field=value,如,nw_src=10.1.2.3. 按位匹配 field=value/mask,如,nw_src=10.1.0.0/255.255.0.0,nw_s ...
- 【Windows】Win10家庭版启用组策略gpedit.msc
[前言] 大家都认为,Windows 10家庭版中并不包含组策略,其实不然,它是有相关文件的,只是不让你使用而已.那么我们让系统允许你使用就好了. [操作步骤] 1.首先你需要在桌面上新建一个txt文 ...
- (转载)微软数据挖掘算法:Microsoft 神经网络分析算法原理篇(9)
前言 本篇文章继续我们的微软挖掘系列算法总结,前几篇文章已经将相关的主要算法做了详细的介绍,我为了展示方便,特地的整理了一个目录提纲篇:大数据时代:深入浅出微软数据挖掘算法总结连载,有兴趣的童鞋可以点 ...
- codevs1700 施工方案第二季
题目描述 Description c国边防军在边境某处的阵地是由n个地堡组成的.工兵连受命来到阵地要进行两期施工. 第一期的任务是挖掘暗道让所有地堡互联互通.现已勘测设计了m条互不相交的暗道挖掘方案, ...
- 基于GTID恢复误篡改数据
问题描述:创建测试库和测试表,先update数据,在delete数据,在update数据,通过gtid查找两次update的值. 参考文档:https://baijiahao.baidu.com/s? ...
- React---路由跳转
最近在开发react的项目中,很多地方都是使用组件式的跳转方式,但是怎么样使用js去控制页面的跳转呢? withRouter withRouter 是一个高阶组件,把 match,location,h ...
- 大数据体系概览Spark、Spark核心原理、架构原理、Spark特点
大数据体系概览Spark.Spark核心原理.架构原理.Spark特点 大数据体系概览(Spark的地位) 什么是Spark? Spark整体架构 Spark的特点 Spark核心原理 Spark架构 ...
- Spring boot 使用Redis 消息队列
package com.loan.msg.config; import com.loan.msg.service.MessageReceiver; import org.springframework ...