首页 > 编程语言 >学习笔记——ST算法

学习笔记——ST算法

时间:2024-01-17 21:58:08浏览次数:31  
标签:int 最大值 笔记 ST 算法 区间 最值

ST 算法

ST 算法是一种运用倍增来解决 RMQ 问题也就是区间最值问题的算法。
给定一个长度为 \(N\) 的序列 \(A\),ST 算法能在 \(\mathcal O(N log N)\) 的时间预处理后,以 \(\mathcal O(1)\) 的时间在线回答区间最值问题。
设 \(F_{i,j}\) 表示序列 \(A\) 中下标在子区间 \(\left[i,i + 2^j - 1 \right]\) 里的数的最大值,也就是从 \(i\) 开始 \(2^j\) 个数的最大值。边界是 \(F_{i,0} = A_i\)。
在递推时我们将子区间的长度成倍增长,\(F_{i,j} = \max(F_{i,j - 1},F_{i + 2^{j-1},j - 1})\),即长度为 \(2^j\) 的子区间的最大值是左右两边长度为 \(2^{j-1}\) 的子区间的最大值中大的那一个。

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

当询问区间 \(\left[l,r \right]\) 的最值时,先找出一个 \(k\),满足 \(2^k \le r - l + 1 \le 2^{k+1}\),那么从 \(l\) 开始的 \(2^k\) 个数和以 \(r\) 结尾的 \(2^k\) 个数一定覆盖了整个区间。
而这两段的最大值分别为 \(F_{l,k}\) 和 \(F_{r - 2^k + 1,k}\),所以整个区间的最值就是这两段中大的那一个。

int ST(int l,int r){
	int k=log(r-l+1)/log(2);
	return max(f[l][k],f[r-(1<<k)+1][k]);
}

标签:int,最大值,笔记,ST,算法,区间,最值
From: https://www.cnblogs.com/MithrilSwordXIV/p/17971259

相关文章

  • 学习笔记——线段树
    线段树(SegmentTree)1.建树首先我们要明白线段树中的每个节点都代表一个区间,而对于线段树中的每个内部节点\(\left[l,r\right]\),它的左子节点是\(\left[l,mid\right]\),右子节点是\(\left[mid+1,r\right]\),其中\(mid=(l+r)/2\)(向下取整)。然后我们可以让根节点的编号为\(......
  • stable Diffusion 启动崩溃 Python异常
    实现"stableDiffusion"启动崩溃Python异常概述在本文中,将介绍如何使用Python语言实现"stableDiffusion"启动崩溃的Python异常。我们将通过以下步骤来完成这个任务:引入所需的库和模块创建一个函数,用于触发异常在函数中添加稳定扩散操作实现异常处理逻辑测试代码......
  • 查看Stable Diffusion pytorch版本
    查看StableDiffusionpytorch版本简介StableDiffusion是一种用于生成模型的无监督学习算法,它可以通过不断扩散噪声来生成逼真的样本。在这篇文章中,我们将介绍如何查看StableDiffusion的pytorch版本,并提供一些代码示例。安装首先,我们需要安装pytorch和torchvision......
  • javaStable Diffusion
    教你实现“javaStableDiffusion”流程及代码示例1.简介JavaStableDiffusion(JSD)是一种用于在Java应用程序中实现稳定的扩散算法的技术。它可以帮助开发者在分布式系统中实现可靠的消息传递和数据同步。本文将向你介绍JSD的实现过程,并提供相应的代码示例。2.实现流程下面是......
  • 549. Binary Tree Longest Consecutive sequence
    给定一棵二叉树,求其最长连续数字路径(指的是形如x,x+1,x+2,...,x+kx,x+1,x+2,...,x+kx,x+1,x+2,...,x+k的路径)的长度。路径可以由任一点出发,任一点结束。publicclassShowMeBug{publicstaticclassTreeNode{publicintval;public......
  • AtCoder Beginner Contest 336
    题目链接:AtCoderBeginnerContest336A-LongLoong题意:输出Long,其中'o'的数量等于n解题思路:签到(其实没看清楚题目wa了一发)查看代码voidsolve(){ intn; cin>>n; cout<<'L'; while(n--)cout<<'o'; cout<<"ng";}......
  • Stack-array based implementation【1月17日学习笔记】
    点击查看代码//Stack-arraybasedimplementation#include<iostream>usingnamespacestd;#defineMAX_SIZE101intA[MAX_SIZE];//globleinttop=-1;//globlevoidpush(intx){ if(top==MAX_SIZE-1){ cout<<"error:stackoverflow"&l......
  • 算法—前缀和
    1.一维前缀和S[i]=a[1]+a[2]+...a[i]//求s[n]a[l]+...+a[r]=S[r]-S[l-1]//求l-r的序列和2.二维前缀和S[i,j]=s[i][j]=s[i-1][j]+s[i][j-1]-s[i-1][j-1]+a[i][j];第i行j列格子左上部分所有元素的和以(x1,y1)为左上角,(x2,y2)为右下角的子矩阵的和为:S[......
  • Numpy学习笔记
    1、创建数组直接创建数组np.array([1,2,3,4])创建指定形状和内容的数组numpy.zeros(shape,dtype=float,order='C')numpy.ones(shape,dtype=float,order='C')numpy.empty(shape,dtype=float,order='C')参数描述shape数组形状dtype数据类......
  • PostgreSQL 临时表
    CREATETEMPTABLE这种方式创建的临时表默认是session级别的,session关闭会自动删除。(也可以创建为事务级别的,事务结束自动删除)。 CREATETEMPTABLEtemp_table_name(column_list);postgresql官方文档介绍:临时表存在于一个特殊的schema里,所以不支持创建的时候指定sch......