【模板】ST表
时间:2019-10-03
本文章向大家介绍【模板】ST表,主要包括【模板】ST表使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
(那一天我唯一彻底搞懂的东西然而现在也忘光光)
先看题:(RP++)
先跳过暴力,这一题肯定不行的
这时就需要ST表,ST表:Sparse Table Algorithm
ST表分为两部分,预处理和查询。
预处理:
采用DP的思想,f[i][ j]表示[i , i+2^j - 1]区间中的最小值(也就是从第i个数起连续2j个数中的最小值)。
数列3,2,4,5,6,8,1,2,9,7。f[1][0]=3,f[1][1]=2,f[1][2]=2,f[1][3]=1,f[2][0]=2,f[2][1]=2,f[2][2]=2……
f[i][ j]可以由f[i][j-1]和f[i+2^j-1][ j-1]导出:
f[i][ j-1]表示区间[i , i+2^j-1-1]的最小值
f[i+2^j-1][ j-1]表示区间[i+2^j-1 , i+2^j-1+2^j-1-1]=[i+2^j-1, i+2^j-1] 的最小值 ,所以有DP方程:f[i][ j]=min(f[i][ j-1],f[i+2^j-1][ j-1])
这一部分都很好懂,接下来就是怎么查询了。
关于长度2k解释:因为要完全覆盖整个区间,而对于求最大值和最小值两个区间有交集是没有影响的(不是精确覆盖),所以可以求2k<=r-l+1
例题:(裸的ST表)
代码:
#include<iostream> #include<cstdio> #include<cmath> using namespace std; int a[1000001]; int Fmax[100005][25]; int Fmin[100005][25]; int n,m; void MM() { for(int j=1;j<=floor(log(n)/log(2));j++) for(int i=1;i+(1<<j)-1<=n;i++) { Fmax[i][j]=max(Fmax[i][j-1],Fmax[i+(1<<(j-1))][j-1]); Fmin[i][j]=min(Fmin[i][j-1],Fmin[i+(1<<(j-1))][j-1]); } } int main() { scanf("%d%d",&n,&m); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); Fmax[i][0]=a[i]; Fmin[i][0]=a[i]; } MM(); int x,y; for(int i=1;i<=m;i++) { scanf("%d%d",&x,&y); int k=floor(log(y-x+1)/log(2)); printf("%d\n",max(Fmax[x][k],Fmax[y-(1<<k)+1][k])); } return 0; }
再看一道题?
大概思路:
(代码有时间再放吧。。要月考了。。。)
原文地址:https://www.cnblogs.com/Daz-Os0619/p/11469735.html
- 如何通过追踪代码自动发现网站之间的“关联”
- 教你如何和使用这款强大的渗透平台-Xerosploit
- No.014 Longest Common Prefix
- Java实现解析IP地址的方法,给出一串数字,生成正确的IP地址
- 图解“管道过滤器模式”应用实例:SOD框架的命令执行管道
- No.013 Roman to Integer
- OData – the best way to REST–实例讲解ASP.NET WebAPI OData (V4) Service & Client
- Java实现的手工做乘法方法,给出二个字符串数字,返回相乘结果
- No.012 Integer to Roman
- 黑帽SEO剖析之手法篇
- IOS学习1——IOS应用程序的生命周期及基本架构
- 浅议“全局变量”、“多线程”和“编译器陷阱”
- Java实现的图片合并方法,支持水平和垂直合并
- OC学习15——文件I/O体系
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- 谁告诉你鸿蒙(HarmonyOS)不能在macOS下玩,一副没见过世面的样子!
- 连Python产生器(Generator)的原理都解释不了,还敢说Python用了5年?
- WordPress插件File-Manager任意文件上传复现
- CVE-2020-15778:OpenSSH命令注入漏洞复现
- TokyoWesterns CTF 6th 2020 部分WP
- 极客巅峰2020 部分WriteUp
- norecon:一款自动化recon工具
- Bashtop:一款功能强大的LinuxOSXFreeBSD资源监控工具
- iOS 推送手机消息背后的技术
- 手把手教你使用 cert-manager 签发免费证书
- flink源码分析之TaskManager启动篇
- 【面试说】一年半前端 Bigo 一二三 面
- 【前端进阶】深入浅出浏览器事件循环【内附练习题】
- 【面试说】一年半前端 Shopee 面经
- 【前端进阶】深入浅出 JavaScript 中的 this