浅谈 ST 表

news2024/10/1 9:39:12

更好的阅读体验

浅谈 ST 表

这种东西还是很简单的,但是涉及左移右移,模板容易打挂,写篇笔记。

ST 表是什么

虽然这个是通过二维数组来实现的,但是我不是很喜欢称之为“表”。我觉得完全可以看作是在一维序列上的区间,看作“表”的话关联性就会很鬼畜。

其主要思想是: f [ i ] [ j ] f[i][j] f[i][j] 表示区间左端点为 i i i,区间长度为 2 j 2^j 2j 的区间信息(可以是最大值、区间和、区间 gcd ⁡ \gcd gcd 等)。

有人说了,那为什么不用线段树?

我一开始也是这么想的,所以我一开始有段时间只会线段树,不会 ST 表。

ST 表的好处在于,他可以 O ( 1 ) O(1) O(1) 查询区间信息。至于预处理,就是 O ( n log ⁡ n ) O(n\log n) O(nlogn) 的。

而线段树,基本任何操作都是 O ( log ⁡ n ) O(\log n) O(logn) 的。

所以如果你想 O ( 1 ) O(1) O(1) 查询,那就要学 ST 表。

注意! ST 表并不支持带修改。也就是说,对于不会修改的题目,并且需要查询时间优秀的题目,ST 表才有比线段树明显的优势。

如何实现 ST 表

预处理

众所周知,如果一个区间的长度是 1 1 1,那么这个“区间”就是 1 1 1 个元素。所以可以直接:

code

for(int i=1;i<=n;i++) f[i][0]=a[i];

接下来考虑区间长度为 2 j 2^j 2j 的区间。

为什么我们要令长度是 2 j 2^j 2j 而不是 j j j 呢?——这正是这个算法的精髓所在。

因为长度为 2 j 2^j 2j 的区间可以看做由两个长度为 2 j − 1 2^{j-1} 2j1 组成,而当我们正要处理出 f [ i ] [ j ] f[i][j] f[i][j] 的时候,肯定已知 f [ i ] [ j − 1 ] f[i][j-1] f[i][j1] (因为我们通过递推得出 f f f),所以可以直接转换。

此处实现代码以维护区间和为例。

code

for(int j=1;(1<<j)<=n;j++)
{
    for(int i=1;i+(i<<j)-1<=n;i++)
    {
        f[i][j]=f[i][j-1]+f[i+(1<<(j-1))][j-1];
    }
}

转换没看懂?

看个图吧

(图中一个“棍棍”就是一个元素)

查询

查询亦是同理,只不过我们 f [ i ] [ j ] f[i][j] f[i][j] 中的 i i i 是开头, l l l 就直接放进去, r r r 就要减去区间长度再 + 1 +1 +1 来得到开头。

这里依然是以区间和为例。

code

int query(int l,int r)
{
    int k=log2(r-l+1);
    return f[l][k]+f[r-(1<<k)+1][k];
}

P3865 【模板】ST 表

code

#include<bits/stdc++.h>
using namespace std;

#define int long long

const int MAXN=1e5+5;

int n,m;
int a[MAXN];
int lg[MAXN];
int f[MAXN][30];

inline int rd()
{
    int x=0,f=1;
    char ch=getchar();
    while(ch<'0'||ch>'9')
    {
        if(ch=='-')
            f=-1;
        ch=getchar();
    }
    while(ch>='0'&&ch<='9')
        x=(x<<3)+(x<<1)+(ch^48),ch=getchar();
    return x*f;
} 

int query(int l,int r)
{
    int k=lg[r-l+1];
    int d=r-(1<<k)+1;
    return max(f[l][k],f[d][k]);
}

signed main()
{
    n=rd(),m=rd();
    for(int i=1;i<=n;i++)
        a[i]=rd();
    for(int i=1;i<=n;i++)
        f[i][0]=a[i];
    for(int i=2;i<=n;i++)
        lg[i]=lg[i>>1]+1;
    for(int j=1;j<=lg[n];j++)
    {
        for(int i=1;i<=n-(1<<j)+1;i++)
        {
            f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);
        }
    }
    while(m--)
    {
        int l=rd(),r=rd();
        printf("%lld\n",query(l,r));
    }
    return 0;
}

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

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

相关文章

sqli-labs通关笔记(less-11 ~ less16)

上一篇文章说了sqli-labs的less-1到less-10的注入方法&#xff0c;这一篇从less-11开始。 由于从11关开始都是post请求&#xff0c;不会像前十关一样存在符号转成unicode的麻烦&#xff0c;所以不再使用apifox&#xff0c;直接从页面上进行测试。 Less-11 老规矩&#xff0c;…

【深度学习】CodeFormer训练过程,如何训练人脸修复模型CodeFormer

文章目录 BasicSR介绍环境数据阶段 I - VQGAN阶段 II - CodeFormer (w0)阶段 III - CodeFormer (w1) 代码地址&#xff1a;https://github.com/sczhou/CodeFormer/releases/tag/v0.1.0 论文的一些简略介绍&#xff1a; https://qq742971636.blog.csdn.net/article/details/134…

React Hooks 源码解析:useEffect

React Hooks 源码解析&#xff08;4&#xff09;&#xff1a;useEffect React 源码版本: v16.11.0源码注释笔记&#xff1a;airingursb/react 1. useEffect 简介 1.1 为什么要有 useEffect 我们在前文中说到 React Hooks 使得 Functional Component 拥有 Class Component 的…

206.反转链表(附带源码)

一、思路 二、代码 一、思路 将指针调转一个方向就行&#xff0c;很简单 做法&#xff1a; 定义2个指针&#xff1a;prev、 cur、 next 当next为空时&#xff0c;循环结束 思路清晰&#xff0c;操作清楚&#xff0c;开始敲代码。 二、代码 struct ListNode* reverseList(s…

Tide Quencher 8WS-Mal,TQ8WS-Mal,能够针对特定的荧光物质进行淬灭

您好&#xff0c;欢迎来到新研之家 文章关键词&#xff1a;Tide Quencher 8WS maleimide&#xff0c;TQ8WS maleimide &#xff0c;Tide Quencher 8WS Mal&#xff0c;TQ8WS Mal&#xff0c;荧光淬灭剂Tide Quencher 8WS 马来酰亚胺 &#xff0c;TQ8WS 马来酰亚胺 一、基本信…

【蓝桥杯备赛Java组】语言基础|竞赛常用库函数|输入输出|String的使用|常见的数学方法|大小写转换

&#x1f3a5; 个人主页&#xff1a;深鱼~&#x1f525;收录专栏&#xff1a;蓝桥杯&#x1f304;欢迎 &#x1f44d;点赞✍评论⭐收藏 目录 一、编程基础 1.1 Java类的创建 1.2 Java方法 1.3 输入输出 1.4 String的使用 二、竞赛常用库函数 1.常见的数学方法 2.大小写转…

链表的分类

链表的八种类别: 这三行属性结合,共有八种链表: 1.带头单向循环 2.带头双向循环 3.带头单向不循环 4.带头双向不循环 5.带头单向循环 6.带头双向循环 7.带头单向不循环 8.带头双向不循环 一.单向或双向 单向链表只有一个指向后续节点的指针 双向链表则有两个指针,分别…

高客单价企业必读:私域运营趋势分析与实操技巧

一、深入挖掘&#xff1a;场景洞察的新维度 当我们收到销售的群发信息时&#xff0c;通常会感到被打扰或骚扰&#xff0c;这是因为这些信息通常是基于广泛的受众群体发送的&#xff0c;缺乏针对个体消费者的定制化和个性化。这种缺乏个性化的沟通方式很容易被消费者视为不必要…

ITSS认证有用吗❓属于gj级证书吗❓

&#x1f525;ITSS由中国电子技术标准化研究院推出&#xff0c;包括“IT 服务工程师”和“IT 服务经理”两种认证。该系列认证符合GB/T 28827.1 的评估和ITSS服务资质升级要求。 &#x1f3af;ITSS是受到gj认可的&#xff0c;在全国范围内对IT服务管理人员从业资格为一的权威的…

计算机网络学习The next day

在计算机网络first day中&#xff0c;我们了解了计算机网络这个科目要学习什么&#xff0c;因特网的概述&#xff0c;三种信息交换方式等&#xff0c;在今天&#xff0c;我们就来一起学习一下计算机网络的定义和分类&#xff0c;以及计算机网络中常见的几个性能指标。 废话不多…

express.js+mysql实现获取文章分类

var express require("express"); var router express.Router(); // 引入封装的获取验证码的方法 var art_handler require("../controllers/artcate"); // 获取文章分类的列表 router.get("/cates", art_handler.getArticleClassification)…

通付盾获2023年度移动互联网APP产品安全漏洞治理优秀案例 荣获工信部CAPPVD漏洞库技术支撑单位

为深入贯彻落实《网络产品安全漏洞管理规定》,规范移动互联网App产品安全漏洞发现、报告、修补和发布等行为&#xff0c;提升网络产品提供者安全漏洞管理意识&#xff0c;探索最前沿的漏洞挖掘技术发展趋势和创新应用&#xff0c;在上级主管部门指导支持下&#xff0c;1月16日&…

浅谈PCB设计与PCB制板的紧密关系

在现代电子领域&#xff0c;印刷电路板&#xff08;PCB&#xff09;是各种电子设备的核心组成部分。PCB设计和PCB制板是电子产品开发过程中不可或缺的两个重要环节。本文将深入探讨PCB设计与PCB制板之间的关系&#xff0c;以及如何通过协同工作实现高效的电子产品开发。 PCB设计…

【QT+QGIS跨平台编译】之三:【OpenSSL+Qt跨平台编译】(一套代码、一套框架,跨平台编译)

文章目录 一、OpenSSL介绍二、OpenSSL配置三、Window环境下配置四、Linux环境下配置五、Mac环境下配置 一、OpenSSL介绍 OpenSSL是一个开放源代码的软件库包&#xff0c;应用程序可以使用这个包来进行安全通信&#xff0c;避免窃听&#xff0c;同时确认另一端连接者的身份。这…

WorkPlus AI助理私有化部署,助力企业降本增效

在当今数字化时代&#xff0c;提供卓越的客户服务成为了企业成功的重要因素。而AI智能客服技术的兴起&#xff0c;则成为了实现高效、快捷客户服务的利器。作为一款领先的AI助理解决方案&#xff0c;WorkPlus AI助理能够私有化部署&#xff0c;为企业打造私有知识库&#xff0c…

无缝衔接Stable Diffusion,一张照片几秒钟就能生成个性化图片-InstantID

最近一段时间基于扩散模型的图像处理方法遍地开花&#xff0c;接下来为大家介绍一种风格化图像的方法InstantID&#xff0c;可以通过仅有一张人脸照片&#xff0c;几秒钟内生成不同风格的人物照片。与传统方法需要多张参考图像和复杂的微调过程不同&#xff0c;InstantID只需一…

Linux: dev: glibc: 里面有很多的关于系统调用的函数

其实都没有实体源代码klogctl.c&#xff0c;而是通过编译时构造出来的源代码实体&#xff0c;比如klogctl这个函数&#xff0c;glibc的反汇编如下&#xff1a; 直接是0x67这个系统调用&#xff1a;103&#xff1a; Reading symbols from /usr/lib64/libc-2.28.so... (No debugg…

vue3前端开发,一篇文章看懂何谓pinia

vue3前端开发,pinia的基础练习第一节&#xff01; 前言&#xff0c;pinia是为了取代vuex而诞生的产品&#xff0c;它有一些改进。去掉了之前的mutations。只有一个action,既可以支持异步&#xff0c;又支持同步。还提供了解构函数&#xff0c;可以把返回的对象内部属性和方法直…

Prometheus配置Grafana监控大屏(Docker)

拉取镜像 docker pull grafana/grafana挂载目录 mkdir /data/prometheus/grafana -p chmod 777 /data/prometheus/grafana临时启动 docker run -d -p 3000:3000 --name grafana grafana/grafana从容器拷贝配置文件至对应目录 docker exec -it grafana cat /etc/grafana/gra…

【RHCSA服务搭建实验】之apache

虚拟web主机类型 一、基于端口 1.vim /etc/httpd/conf.d/vhost2.conf ---- — 改变http服务默认访问路径 <directory /testweb1>allowoverride none 表示不允许覆盖其他配置require all granted 表示允许所有请求 </directory> <virtualhost 0.0.0.0:…