ST表学习笔记
ST表是一种利用DP思想求解最值的倍增算法
ST表常用于解决RMQ问题,即求解区间最值问题
接下来以求最大值为例分步讲解一下ST表的建立过程:
1.定义
f[i][j]表示[i,i+2j-1]这个长度为2j的区间中的最大值
2.预处理
f[i][0]=a[i],即区间[i,i]的最大值就是a[i]
3.状态转移
将[i,i+2j-1]平均分成两份,分别为[i,i+2j-1-1]和[i+2j-1,i+2j-1],两段的长度均为2j
[i,i+2j-1]的最大值为这两段的最大值中的较大值,即f[i][j]=max(f[i][j-1],f[i+2j-1][j-1])
4.核心代码
void ST(int n){
for(int j=;j<=;j++)
//注意要把j放外层,这样可以确保此时f[i+(1<<(j-1))][j-1]已经被赋值了
for(int i=;i<=n;i++)//枚举区间左端点
if(i+(<<j)-<=n)
f[i][j]=max(f[i][j-],f[i+(<<(j-))][j-]);
}
好啦建立好了ST表,接下来我们就可以直接O(1)地查询啦!QWQ
讲一讲查询的步骤:
1.查询过程
若需要查询的区间为[i,j],那么我们需要找到两个覆盖这个闭区间的最小幂区间,这两个区间可以重叠,因为这对区间最大值并没有什么影响。
这个区间的长度为j-i+1,所以我们要记录一个值k=log2(j-i+1)
于是就可以得到答案MAX(i,j)=max(f[i][k],f[j-(1<<k)+1][k])
2.完整代码
#include<bits/stdc++.h>
#define go(i,a,b) for(register int i=a;i<=b;i++)
using namespace std;
const int MAXN=1e6+;
int a[MAXN],f[MAXN][];
void ST(int n){
go(j,,)
go(i,,n)
if(i+(<<j)-<=n)
f[i][j]=max(f[i][j-],f[i+(<<(j-))][j-]);
return;
}
int main(){
int n,m;
scanf("%d%d",&n,&m);
go(i,,n) scanf("%d",&a[i]),f[i][]=a[i];
ST(n);
while(m--){
int i,j;
scanf("%d%d",&i,&j);
int k=(int)(log(j-i+)/log(2.0));
printf("%d\n",max(f[i][k],f[j-(<<k)+][k]));//O(1)直接查询
}
return ;
}
Update!
加一道例题——
ST表学习笔记的更多相关文章
- S-T表学习笔记
$O(nlogn)$构造$O(1)$查询真是太强辣 然而不支持修改= = ShØut! #include<iostream> #include<cstring> #includ ...
- Servlet乘法表学习笔记
一.控制台实现乘法表 package com.shanrengo; import java.io.IOException; import java.io.PrintWriter; import jav ...
- ST表学习总结
前段时间做16年多校联合赛的Contest 1的D题(HDU 5726)时候遇到了多次查询指定区间的gcd值的问题,疑惑于用什么样的方式进行处理,最后上网查到了ST表,开始弄得晕头转向,后来才慢慢找到 ...
- st表复习笔记
st表,一种高效的区间最值查询(RMQ)算法.本质其实是一个动态规划. 其实吧,对于看过线性dp的人来说应该不难理解,只是处理有些麻烦.但是本土狗因为-1的问题居然改了许久... 用两个2^i的区间把 ...
- ST 表练习笔记
P2048 [NOI2010]超级钢琴 首先按照 前缀和最大值 建立 \(ST\) 表 对于每一个 \(i\) 维护一个以他为起始点的最大的 "超级和弦" (\(ST\) 表 \( ...
- java线性表学习笔记(一)
线性表是一种按顺序储存数据是的常用结构,大多数的线性表都支持以下的典型操作: 从线性表提取插入删除一个数据: 找出线性表中的某一个元素: 找出线性表中的元素: 确定线性表中是否包含某一个元素,确定线性 ...
- ST表学习
啊谈不上学习了.复习一下原理留一下板子. $f\left[i,j \right]$表示以$i$为起点,区间长度为${2}^{j}$的区间最值.以最小值为例,即 $min\left(a\left [ k ...
- windows注册表学习笔记
注册表,想起来了就学学,方便操作.无需把它当成重要学问,今日就学一波,作为了解. 一.注册表清理脚本 主要是删除临时文件,旧文件.并不能够删除无效的键 @echo off del/f/s/q %sys ...
- ST 表学习
作用:ST算法是用来求解给定区间RMQ的最值,本文以最小值为例 举例: 给出一数组A[0~5] = {5,4,6,10,1,12},则区间[2,5]之间的最值为1. 方法:ST算法分成两部分:离线预处 ...
随机推荐
- kernel笔记——定时器与时间管理
内核中时钟主要完成以下作用: 记录系统运行时间 完成时间相关的统计功能,如cpu占用率等 定时功能,设定某个进程一段时间后完成某项任务 为实现以上功能,硬件以及内核提供了不同类型的时钟. RTC 实时 ...
- 虚拟DOM和react中的diff算法总结
https://blog.csdn.net/qq_26708777/article/details/78107577 一.虚拟DOM 1.什么是虚拟DOM及原理 把真实DOM树,变成js ...
- mysql 解压版安装
1.官网下载压缩包 2.解压 3.配置环境变量 添加系统环境变量 MYSQL_HOME 值为解压的主目录,例如 D:\mysql-5.7.25-winx64 修改Path 环境变量,点击编辑 ...
- Shell命令-线上查询及帮助之man、help
线上查询及帮助 - man.help 1.man:获取命令的帮助信息 man命令的简单介绍 man命令是Linux系统中最核心的命令之一 ,因为通过它可以查看其它Linux命令的使用信息.当然了 ,m ...
- pci设备驱动相关
pci 设备注册及查找: https://www.cnblogs.com/image-eye/archive/2012/02/15/2352912.html PFN https://nieyong.g ...
- EntityFramework优化:查询性能
1. 禁用延迟加载 延迟加载是常见的方式,Entity Framework在需要时可以自动为一个实体的实例获取关联的数据. Entity Framework自动延迟加载需要同时满足以下3个条件: (1 ...
- 前端获取checkbox复选框的值 通过数组形式传递
html代码: <form role="form" class="select_people"> <div style="displ ...
- CentOS修改SSH端口号和禁止root用户直接登录
linux安装ssh远程登录后,为了安全起见,修改默认的22端口号并禁止root用户直接通过ssh登录. 配置方法如下: 1.使用vi编辑器打开ssh配置文件 /etc/ssh/sshd_config ...
- BZOJ3028食物——生成函数+泰勒展开
题目描述 明明这次又要出去旅游了,和上次不同的是,他这次要去宇宙探险!我们暂且不讨论他有多么NC,他又幻想了他应 该带一些什么东西.理所当然的,你当然要帮他计算携带N件物品的方案数.他这次又准备带一些 ...
- 平衡树splay学习笔记#1
这一篇博客只讲splay的前一部分的操作(rotate和splay),后面的一段博客咕咕一段时间 后一半的博客地址:[传送门] 前言骚话 为了学lct我也是拼了,看了十几篇博客,学了将近有一周,才A掉 ...