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

数据结构·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;

例题

相关文章:

  • Git 时光机:修改Commit信息
  • json格式不合法情况下,如何尽量保证数据可用性
  • 音频类网站或者资讯总结
  • 40、C# 数组、链表、哈希、队列、栈数据结构的特点、优点和缺点
  • Python生活手册-NumPy统计:从快递站到咖啡店的数字密码
  • 源码示例:使用SpringBoot+Vue+ElementUI+UniAPP技术组合开发一套小微企业ERP系统
  • Flask 调试的时候进入main函数两次
  • Python教程(四)——数据结构
  • 画立方体软件开发笔记 js three 投影 参数建模 旋转相机 @tarikjabiri/dxf导出dxf
  • 常见音频主控芯片以及相关厂家总结
  • win10-启动django项目时报错
  • Go语言——goflow工作流使用
  • MySQL 中 count(*)、count(1) 和 count(字段名) 有什么区别?
  • 访问者模式(Visitor Pattern)详解
  • excel大表导入数据库
  • RAG 2.0 深入解读
  • OSPF不规则区域划分
  • 从代码学习深度学习 - 语义分割和数据集 PyTorch版
  • 部署RocketMQ
  • 垃圾对象回收
  • 工行回应两售出金条发现疑似杂质:情况不属实,疑似杂质应为金条售出后的外部附着物
  • 探索人类的心灵这件事,永远也不会过时
  • 印观察|印巴战火与莫迪政府三重冒险:南亚火药桶已至临界点
  • 李云泽:再批复600亿元,进一步扩大保险资金长期投资试点范围
  • 吴清:全力支持中央汇金公司发挥好类“平准基金”作用
  • 巴基斯坦军方:印度导弹袭击已造成至少3人死亡