首页 > 其他分享 >ST表

ST表

时间:2024-05-12 11:30:01浏览次数:11  
标签:int max ST 数组 区间 预处理

0 面向问题

我们希望有一个数据结构能够解决静态区间求最值、gcd....等问题并且可以在 \(O(nlogn)\) 范围内预处理 \(O(1)\) 查询

1 思路

ST表通常维护一些具有可合并性的东西,就是可以分别计算并且不在乎重复计算,比如最大最小值和最大公约数

(但是区间和之类就不行)

以最大值为例

考虑倍增

我们设一个数组 \(F_{i,j}\) 表示从 \(i\) 开始(包括 \(i\))的 \(2^j\) 个数的最大值,即 \([i,i+2^j-1]\) 范围的 \(\max\)

这个东西跟 dp 很像,我们可以看看这玩意怎么转移

注意力稍微集中一下我们很快可以发现 \(F_{i,j}=\max(F_{i,j-1},F_{i+2^{j-1},j-1})\)

边界也十分简单 \(F_{i,0}=a_i\) 其中 \(a\) 是原数组

我们可以码一个简单地预处理:

const int  N=1e5,LGN=31;//数组长度和logn的上界 
#define tn(x) (1<<(x));
//简单地宏定义一下 2^x 这个函数方便用 
void init(){
	LOG[1]=0,LOG[2]=1;
	for(int i=3;i<=n;i++)LOG[i]=LOG[i/2]+1; 
	//此处为预处理log2(n) 的值 
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int j=0;j<=LGN;j++){
		for(int i=1;i+tn(j)-1<=n;i++){
			ST[i][j]=max(ST[i][j-1],ST[i+tn(j-1)][j-1]);
		} 
	}
} 

这里多预处理了一下 \(log2\) 因为后边要用

查询呢?

现在稍微推一下,若查询区间为 \([l,r]\)

我们希望用两个区间,一个从 \(l\) 开始,一个在 \(r\) 结束,并且两个区间能覆盖到 \([l,r]\) 之间的每一个值

假如第一个区间是 \(F_{l,p}\),那么 \(p\) 一定是满足 \(l+2^p-1<=r\) 的最大的数

可求得 \(p=log2(r-l+1)\),不妨取另一个区间为 \(F_{r-2^p+1,p}\),因为 \(p\) 的最大性容易看出这两个区间的确可以覆盖 \([l,r]\)

code:

void qmax(int l,int r){
	int p=LOG(r-l+1);
	return max(ST[l][p],ST[r-tn(p)+1][p]);
}

标签:int,max,ST,数组,区间,预处理
From: https://www.cnblogs.com/exut/p/18187574

相关文章

  • SystemVerilog -- 10.2 SystemVerilog Coverpoint Bins
    SystemVerilogCoverpointBins该构造允许在coverpoint变量的给定可能值范围内为每个值创建一个单独的bin。binUsagecoverpointmode{//Manuallycreateaseparatebinforeachvaluebinszero={0};binsone={1};//AllowSystemVerilogtoautomatic......
  • Windows hosts 文件是一个文本文件,用于将主机名与相应的 IP 地址进行映射。这个文件通
    C:\Windows\System32\drivers\etc\hosts是一个计算机上的文件路径,通常用于存储主机名与IP地址之间的映射关系。在Windows操作系统中,这个文件被称为"hosts"文件。这个文件的作用是将主机名映射到相应的IP地址,这样当你在浏览器中输入一个域名时,系统会首先查看这个文件......
  • AtCoder Beginner Contest 353
    A-Buildings(abc353A)题目大意给定\(n\)个数字,输出第一个大于第一个数的下标。解题思路依次与第一个数比较,大于则输出。神奇的代码n=input()a=list(map(int,input().split()))b=[i>a[0]foriina]ifTruenotinb:print(-1)else:print(b.ind......
  • SystemVerilog -- 10.1 SystemVerilog Covergroup and Coverpoint
    SystemVerilogCovergroupandCoverpointSystemVerilog是一种用户定义的类型,用于封装覆盖率模型的规范。它们可以定义一次,并通过函数在不同位置实例化多次。covergroupnewcovergroup可以在包、模块、程序、接口类中定义,通常封装以下信息:AsetofcoveragepointsCrosscov......
  • 关于事件对象中的stopImmediatePropagation
    关于e.stopPropagation(),大家应该知道这个方法是用来阻止事件冒泡的。那么e.stopImmediatePropagation()可能比较少见。stopImmediatePropagation用来阻止在同一DOM对象上同一事件类型的其它事件函数的执行并且与事件先后注册的顺序有关document.addEventListener("click",e=......
  • 数据分享|python分类预测职员离职:逻辑回归、梯度提升、随机森林、XGB、CatBoost、LGB
    全文链接:https://tecdat.cn/?p=34434原文出处:拓端数据部落公众号分析师:ShilinChen离职率是企业保留人才能力的体现。分析预测职员是否有离职趋向有利于企业的人才管理,提升组织职员的心理健康,从而更有利于企业未来的发展。解决方案任务/目标采用分类这一方法构建6种模型对职......
  • MATLAB用深度学习长短期记忆 (LSTM) 神经网络对智能手机传感器时间序列数据进行分类|
    原文链接:http://tecdat.cn/?p=26318原文出处:拓端数据部落公众号 最近我们被客户要求撰写关于长短期记忆(LSTM)神经网络的研究报告,包括一些图形和统计输出。此示例说明如何使用长短期记忆(LSTM)网络对序列数据的每个时间步长进行分类。要训​​练深度神经网络对序列数据......
  • 【视频】R语言逻辑回归(Logistic回归)模型分类预测病人冠心病风险|数据分享|附代码数据
    原文链接:http://tecdat.cn/?p=22410 最近我们被客户要求撰写关于逻辑回归的研究报告,包括一些图形和统计输出。本文介绍了逻辑回归并在R语言中用逻辑回归(Logistic回归)模型分类预测病人冠心病风险数据逻辑回归是机器学习借用的另一种统计分析方法。当我们的因变量是二分或二元时......
  • SystemVerilog -- 10.0 SystemVerilog Functional Coverage
    SystemVerilogFunctionalCoverageWhatisfunctionalcoverage?functionalcoverage是测试对设计的哪些功能/特性的衡量。这在约束随机验证(CRV)中非常有用,可以了解回归中的一组测试涵盖了哪些特征。Whatareitslimitations?这仅与为它编写的代码一样好。假设您在设计文档......
  • 关于VHDL中Loop State error...loop must terminate within 10,000 iterations错误解
    关于VHDL中LoopStateerror...loopmustterminatewithin10,000iterations错误解决方法首先比较下面两段代码:(使用while循环描述偶校验位产生电路)代码一:libraryieee;useieee.std_logic_1164.all;useieee.std_logic_unsigned.all;useieee.std_logic_arith.all;ent......