当前位置: 首页 > news >正文

算法 之 ST表

文章目录

    • 区间最大值

  • ST表(Sparse Table)是一种高效处理静态数据区间查询的数据结构,主要的作用是用于快速查询区间的最值,区间GCD,区间按位与或

在这里以区间最大值为例子说明st表的模版

  • 总体的思想就是定义dp[i][j]表示下标为i长度为2^j的区间的最大值,这个dp数组的定义的大小第一维度为原始的数组的长度(+1也可以),第二个维度就是数组长度取log2然后+1,反正就是得取大点

初始化st表

def init_st(n)
	# 假设数组的下标从1开始
	for i in range(1,N):
		dp[i][0] = num[i]
	# 枚举区间的长度,假设最大的长度不超过2^19
	for i in range(1,20):
		# 枚举区间的开始的位置,原始的下标的范围是 1到 n
		# 区间长度为2^i的时候,区间的最右边的下标最大可以为n-(1<<i)+1
		for j in range(1,n-(1<<i)+2):
			# 分为两部分,后面的那一半的开始位置是 j + 2^(i-1)
			dp[j][i] = max(dp[j][i-1],dp[j+(1<<(i-1))][i-1])

查询操作

def query_st(l,r):
	k = int(math.log2(r-l+1))
	return max(dp[l][k],dp[r-(1<<k)+1][k])

区间最大值

区间最大值

在这里插入图片描述
在这里插入图片描述

  • 直接套用模版
import math

# 直接使用st表进行求解

N,Q = map(int,input().split())

a = [0] +  list(map(int,input().split()))

dp = [[0]*(20) for _ in range(N+1) ]

def init_stl():
  # 初始化st表
  # 定义dp[i][j]表示以i开始的,长度为2^j的区间的最大值
  for i in range(1,N+1):
    dp[i][0] = a[i]
  # 枚举长度的幂次
  for i in range(1,20):
    # 枚举开始的位置
    for j in range(1,N-(1<<i)+2):
      dp[j][i] = max(dp[j][i-1],dp[j+(1<<(i-1))][i-1])

def query_stl(l,r):
  k = int(math.log2(r-l+1))
  ans = max(dp[l][k],dp[r-(1<<k)+1][k])
  return ans

init_stl()


for _ in range(Q):
  l,r = map(int,input().split())
  print(query_stl(l,r))



相关文章:

  • 基于Android语言实现身份证二要素核验-身份证实名认证API
  • 【k8s】serviceaccount是给pod使用的与外部访问k8s无关
  • 深入理解事务
  • GoLang 反射
  • pppd拨号模块的总结【Linux】
  • 【从零开始学习计算机科学与技术】计算机网络(五)网络层
  • 【npm ERR! code ERESOLVE npm ERR! ERESOLVE unable to resolve dependency tree】
  • 3.4 二分查找专题:LeetCode 69. x 的平方根
  • TCP、UDP协议的应用、ServerSocket和Socket、DatagramSocket和DatagramPacket
  • 查询修改ORACLE的server、客户端和导出dmp文件 字符集编码
  • SpringBoot-2整合MyBatis以及基本的使用方法
  • 大模型学习-让其他电脑可访问本地ollama的模型并进行流式响应
  • AMD锐龙8845HS+780M核显 虚拟机安装macOS 15 Sequoia 15.0.1 (2024.10)
  • 【ELK】节省存储 之 压缩存储方式调整
  • element-ui image 组件源码分享
  • cls(**dict(data, id=id))灵活地从一个字典生成实例,同时确保某些关键字段(如 id)被正确设置或覆盖
  • 问deepseek: 如何用CUDA实现PBiCGSTAB稀疏矩阵迭代算法,写段示例代码
  • OLE注册是什么?
  • 博客图床 VsCode + PicGo + 阿里云OSS
  • $.ajax的contentType设置及对应后端数据获取方式
  • 15世纪以来中国文化如何向欧洲传播?《东学西传文献集成初编》发布
  • 这座“蚌埠住了”的城市不仅会接流量,也在努力成为文旅实力派
  • 建发股份:将于5月6日召开股东大会,审议提名林茂等为公司新一届董事等议案
  • 西班牙葡萄牙突发全国大停电,欧洲近年来最严重停电事故何以酿成
  • 北京朝阳涉住宅组团地块126亿元成交
  • 特朗普声称中方领导人打了电话,外交部:近期中美元首没有通话