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

数据结构·ST表

ST表(Sparse Table)

可重复贡献问题

  • x o p t x = x x \ opt\ x = x x opt x=x :如果两个区间重复计算某些元素时,对重复元素进行 o p t opt opt操作没有任何影响

理解

ST表的思想是倍增,每一次处理上一次处理的两倍的元素,倍增的方式有重叠部分,如果重叠部分可重复贡献,则倍增的思路是正确的。

  • 长度:int len=log2(n),向下取整,避免出现无效元素参与计算
  • 构造时的递推公式:amax[j][m] = max(amax[j - 1][m], amax[j - 1][m + (1 << j - 1)]),例子:第3层第1个元素,由第2层第1,2,3个元素累积得到,其中第二个元素出现重复。
  • query:max(amax[len][l], amax[len][r - (1 << len) + 1]),首先查询当前层l处的元素,然后考虑当前层代表了 2 l e n 2^{len} 2len个元素,由第一层元素反推第len层元素。

模板

  • init()操作: O ( n l o g n ) O(nlogn) O(nlogn)复杂度
		int len = log2(n);for (int j = 1; j <= len; j++) {for (int m = 1; m <= n - (1 << j) + 1; m++) {amax[j][m] = max(amax[j - 1][m], amax[j - 1][m + (1 << j - 1)]);amin[j][m] = min(amin[j - 1][m], amin[j - 1][m + (1 << j - 1)]);}}
  • query()操作: O ( 1 ) O(1) O(1)仅仅支持静态查询,不支持任意修改方式
int query(int l,int r,int flag) {//flag==1 maxint len = log2(r - l + 1);if (flag)return max(amax[len][l], amax[len][r - (1 << len) + 1]);return min(amax[len][l], amax[len][r - (1 << len) + 1]);
}
  • 优化:log2操作比较费时,所以可以采用dp方式优化该运算。
lg[0]=-1;
for(int i=1;i<=n;i++)lg[i]=lg[i>>1]+1;

例题

http://www.xdnf.cn/news/5308.html

相关文章:

  • diy装机成功录
  • Vue3组件通信 emit 的工作原理
  • 真人配音与AI创作有声读物
  • 操作系统学习笔记第1章 (竟成)
  • List接口
  • C PRIMER PLUS——第7节:指针
  • Day 3:Warp协作功能深度实战
  • 运放OP方向技术要点和大厂题目解析
  • 文件IO之系统IO
  • dockerfile编写入门
  • 十六、统一建模语言 UML
  • 16前端项目----交易页
  • QT6 源(90):阅读与注释 LCD显示类 QLCDNumber ,源代码以及属性测试。该类继承于容器框架 QFrame
  • Windows报错:OSError: [WinError 1455] 页面文件太小,无法完成操作的问题
  • Redis能保证数据不丢失吗之RDB
  • 【Web】使用Vue3开发鸿蒙的HelloWorld!
  • 模拟太阳系(C#编写的maui跨平台项目源码)
  • Autoware message_filters::Synchronizer链接错误问题
  • Axure疑难杂症:统计分析页面引入Echarts示例动态效果
  • 目录粘滞位的使用
  • JDBC链接数据库
  • 【typenum】 0 配置文件(Cargo.toml)
  • 【MySQL】事务(重点)
  • 酒店洗护用品那些事儿:品牌选择及扬州卓韵用品介绍
  • 6. 存储池配置与CephFS创建 ceph version 14.2.22
  • muduo源码解析
  • 【第33节 数据库基础概念】
  • 游戏引擎学习第269天:清理菜单绘制
  • [模型选择与调优]机器学习-part4
  • PyTorch API 6 - 编译、fft、fx、函数转换、调试、符号追踪