稀疏表(ST表,Sparse Table)

news2024/11/16 2:47:56

ST表用来解决区间最值问题(也可以解决区间gcd)
利用倍增的思想, O ( n log ⁡ 2 n ) O\left(n\log_2 n\right) O(nlog2n)预处理, O ( 1 ) O\left(1\right) O(1)区间查询

在这里插入图片描述
f ( i , j ) f\left(i,j\right) f(i,j)表示区间 [ i , i + 2 j − 1 ] \left[i,i+2^j-1\right] [i,i+2j1]
f ( i , 0 ) = a i f\left(i,0\right) = a_i f(i,0)=ai
f ( i , j ) = max ⁡ ( f ( i , j − 1 ) , f ( i + 2 j − 1 , j − 1 ) ) f\left(i,j\right) = \max\left(f\left(i,j-1\right), f\left(i+2^{j-1},j-1\right)\right) f(i,j)=max(f(i,j1),f(i+2j1,j1))
对于查询 [ l , r ] \left[l,r\right] [l,r],令 s = ⌊ log ⁡ 2 ( r − l + 1 ) ⌋ s = \left\lfloor \log_2\left(r-l+1\right) \right\rfloor s=log2(rl+1)
通过 max ⁡ ( f [ l , l + 2 s − 1 ] , f [ r − 2 s + 1 , r ] ) \max\left(f\left[l,l+2^s -1\right],f\left[r-2^s + 1, r\right]\right) max(f[l,l+2s1],f[r2s+1,r])来找到 [ l , r ] \left[l,r\right] [l,r]的最大值
(为什么不是 [ l + 2 s , r ] \left[l +2^s,r\right] [l+2s,r]?因为有可能越界)

剩下的就是可以考虑预处理 log ⁡ 2 \log_2 log2

int logn[N] = { -1, 0 };//floor( log2 n )
//预处理log2
for (int i = 2; i <= n; ++i) {
	logn[i] = logn[i >> 1] + 1;
}

// pre C++20
int log2_floor(unsigned long long i) {
    return i ? __builtin_clzll(1) - __builtin_clzll(i) : -1;
}

// C++20
#include <bit>
int log2_floor(unsigned long i) {
    return std::bit_width(i) - 1;
}

洛谷P3865

#include<cstdio>
#include<algorithm>

const int N = 1e5 + 5;

int logn[N] = { -1, 0 };//floor( log2 n )
int st[N][21];

int main() {
	int n, m;
	scanf("%d%d", &n, &m);

	//预处理log2
	for (int i = 2; i <= n; ++i) {
		logn[i] = logn[i >> 1] + 1;
	}
	
	for (int i = 1; i <= n; ++i) {
		scanf("%d", &st[i][0]);
	}

	//预处理
	for (int j = 1; j <= logn[n]; ++j) {
		for (int i = 1; i + (1 << j) - 1 <= n; ++i) {
			st[i][j] = std::max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]);

		}
	}

	while (m--) {
		int l, r;
		scanf("%d%d", &l, &r);
		int s = logn[r - l + 1];
		printf("%d\n", std::max(st[l][s], st[r - (1 << s) + 1][s]));
	}

	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/184888.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

TypeScript 学习笔记总结(二)

TypeScript 笔记记录&#xff0c;侧重于接口&#xff0c;对象等内容。 文章目录一、 TS 面向对象二、TS 类三、TS 继承四、TS super关键字五、TS 抽象类六、TS 接口七、TS 属性封装八、TS 泛型一、 TS 面向对象 js也是面向对象的&#xff0c;并不是面向过程的。 下面&#xf…

虹科案例 | AR数字化解决方案在石油与天然气领域“大放异彩”

石油和天然气在当今人类社会中扮演着重要角色&#xff0c;但是石油和天然气的开采&#xff0c;却是耗费成本巨大的工程&#xff0c;石油和天然气公司也在不断寻找着能帮助他们降低运营成本并提高效率的好方法。 事实上&#xff0c;AR技术解决方案能帮助这些公司实现他们的目标…

Linux[安装gitlab笔记]

参考文章&#xff1a;https://www.jianshu.com/p/2cb10c11813d CentOS7下安装gitlab中文版 前提&#xff1a; 下载文件&#xff1a;gitlab-ce-12.9.2-ce.0.el7.x86_64.rpm 地址1&#xff1a;https://packages.gitlab.com/gitlab/gitlab-ce 地址2&#xff1a;https://mirrors.…

JVM——类加载与字节码技术(3)

目录四、类加载阶段4.1 加载4.2 链接4.3 初始化五、类加载——练习练习1练习2四、类加载阶段 4.1 加载 ① 将类的字节码载入方法区&#xff08;1.8后为元空间&#xff0c;在本地内存中&#xff09;中&#xff0c;内部采用 C 的 instanceKlass ● _java_mirror 即 java 的类镜…

大数据技术架构(组件)10——Hive:集合函数类型转化函数

1.4.3、集合函数1.4.3.1、size select map(a,1,b,2),size(map(a,1,b,2)),array(1,2,3,4),size(array(1,2,3,4));1.4.3.2、map_keysselect map(a,1,b,2), map_keys(map(a,1,b,2));1.4.3.3、map_valuesselect map(a,1,b,2), map_values(map(a,1,b,2));1.4.3.4、array_containssel…

中国国际电子商务中心与易观分析联合发布:2022年3季度全国网络零售发展指数同比增长1.5%

近日&#xff0c;中国国际电子商务中心与易观分析联合发布2022年3季度“全国网络零售发展指数”及其分指数。2022年3季度全国网络零售发展指数同比增长1.5%&#xff0c;环比下降2.9%。随着稳经济一揽子政策和接续措施全面落地显效&#xff0c;生产加快回暖&#xff0c;经济平稳…

vmstat、free、df、iostat、sar

1. vmstat看CPU vmstat -n 2 3 一般vmstat工具的使用是通过两个数字参数来完成的&#xff0c;第一个参数是采样的时间间隔数单位是秒&#xff0c;第二个参数是采样的次数 -procs r:运行和等待CPU时间片的进程数&#xff0c;原则上1核的CPU的运行队列不要超过2&#xff0c;整个…

Softing为Endress+Hauser提供过程自动化连接解决方案

一 背景 恩德斯豪斯&#xff08;EndressHauser&#xff09;是一家总部位于瑞士的过程工业自动化解决方案的全球领军企业&#xff0c;致力于为过程工业及实验室自动化领域提供测量仪器、服务和解决方案。其产品被广泛应用于石油、化工、制药、食品饮料以及废水处理等过程自动化…

银河麒麟V10操控系统Qt安装

下载安装镜像申请试用https://www.kylinos.cn/support/trial.html&#xff0c;根据CPU架构选择要下载的安装包。AMD、Intel的CPU下载银河麒麟桌面操作系统V10 AMD64版本&#xff0c;我下载的Kylin-Desktop-V10-SP1-HWE-Release-2203-X86_64.iso制作系统安装启动U盘下载制作启动…

1. kafka-提高生产者吞吐量

kafka的基础使用知识不在这篇文章阐述&#xff0c;默认读者都会使用 首先kafka的生产者原理&#xff0c;如下。图来自网上 上面的图可能不全&#xff0c; 我再详细描述下&#xff0c;在消息发送过程中&#xff0c;设计到两个线程main和sender线程&#xff1b; &#xff08;1…

Java接口——子接口是否能直接通过子接口名调用父接口类方法

Java9允许在接口中定义默认方法和类方法&#xff0c;为接口增加了一种私有方法&#xff0c;也可以提供实现。 接口就是定义一组通用的方法&#xff0c;就像U盘&#xff0c;只要是USB接口大部分都可以在电脑上使用&#xff0c;电脑无需关心U盘内部怎么实现&#xff0c;只需要告…

浅谈python中@装饰器 - 附例子(含类装饰器与函数装饰器)

浅谈python中装饰器 文章目录浅谈python中装饰器关于装饰器&#xff08;decorator&#xff09;小总结关于&#xff08;语法糖&#xff09;进阶装饰器顺序装饰器 & 参数End提到的使用首先要先讲一下装饰器的概念 关于装饰器&#xff08;decorator&#xff09; 先来看看官方…

计算机相关专业提升学历的解决方案(硕士研究生)

文章目录1、正规全日制硕士1.1 研究生入学考试1.2 硕士毕业要求2、继续教育&#xff08;非全日制&#xff09;2.1 在职研究生2.2 同等学力申硕3、海外硕士3.1 海外硕士申请3.2 中外合作项目1、正规全日制硕士 1.1 研究生入学考试 1、考试报名 官方网站&#xff1a;国家研究生…

玩转PPT 第2节 PPT第一辅助神器iSlide操作

ppt神器 第2节 islide常用操作锦集1 一键优化1.1 统一字体1.2 统一段落1.3 统一参考线1.4 统一主题色2 设计排版2.1 快速复制图形实现矩阵布局2.2 环形布局复制2.3 环形裁剪2.4 矩阵裁剪3 设计工具3.1 对齐3.2 大小3.3 对齐到参考线3.4 选择&#xff0c;相当于快速组合取消等3.…

树与二叉树深度剖析(二)

一. 树表示法1.双亲表示法(1).含义在一棵树中&#xff0c;任意一个结点的双亲只有一个&#xff0c;这是由树的定义决定的。双亲表示法就是利用了树的这个性质&#xff0c;在存储结点信息的同时&#xff0c;在每个节点中附设一个指向其双亲的指针&#xff0c; 指向双亲在链表中的…

IMX Linux 用户手册 — 3

IMX Linux 用户手册 — 3 10.3 CAAM Job Ring后端驱动规范 CAAM作业环后端驱动(caam_jr)实现并使用作业环接口(JRI)向CAAM引擎提交来自前端驱动(caamalg, caamhash, caampkc, caamrng, caamkeyblob)的加密API服务请求。 CAAM驱动程序有几个选项&#xff0c;最显著的是硬件工作…

ssm宿舍水电费报修考勤管理系统的开发与实现

目 录 摘 要 I 目 录 1 第1章 概述 1 1.1 研究背景 1 1.2 研究现状 1 1.3 研究内容 2 第二章 开发技术介绍 2 2.1 系统开发平台 2 2.2 平台开发相关技术 3 2.2.1 B/S架构 3 2.2.2 mysql数据库介绍 4 2.2.3 JSP技术介绍 4 第三章 系…

如何增强企业数字敏捷性?|身份云研究院

在经济下行背景中&#xff0c;企业面临数字化转型和降本增效两大课题&#xff0c;解决这两个问题的核心是增强企业数字敏捷性。比起从业务侧逐个优化&#xff0c;决策者们更应从数字化基础设施入手&#xff0c;搭好底层数字化架构来保障企业在不断变化的技术和法规中获得适应性…

随时随地查看远程试验数据与记录——IPEhub2与IPEmotion APP

一 背景 在工况恶劣、空间狭小的试验场景或工程机械领域中&#xff0c;不但试验人员在试验环境中对自身安全没有保障&#xff0c;而且试验过程也会受到影响&#xff0c;如高温高压测试、工程机械液压系统测试等。对此&#xff0c;结合IPEhub2与IPEmotion APP&#xff0c;既可保…

linux journalctl使用详解

1.概述 ​ journalctl 用来查询 systemd-journald 服务收集到的日志。systemd-journald 服务是 systemd init 系统提供的收集系统日志的服务。journalctl通常用来查询systemd管理的Unit的日志信息。 2.使用方法 $ man journalctl $ journalctl --help 常用方法 $ journalctl …