尧图网站建设 尧图网络
  • 首页
  • 关于我们
  • 服务项目
  • 案例展示
  • 建站流程
  • 资讯中心
  • 联系我们
首页/资讯中心/详情

20251027 - 倍增 ST表

20251027 - 倍增  ST表
📅 发布时间:2026/6/18 18:06:50

前言:

怎么标题改来改去的?

概念

因为每一个整数都可以转换成对应的二进制,所以可以表示成 \(a_0 \times 2^0 + a_1 \times 2 ^ 1 + a_2 \times 2 ^ 2 + a_{len} \times 2 ^ {len}\)。

因此,对于求跳 \(x\) 步后的状态,可以先预处理 \(2^{len}\) 的表,每次跳跃从一步一步往上跳进化成每次跳 \(2^{i}\) 步。

这就是倍增的概念。

用处

比如求 \(\operatorname{LCA}\),就可以用倍增从 \(O(qn)\) 优化到 \(O(q \log _2n)\)。

接下来的 ST 表也是运用了倍增!

ST 表

ST 表(Sparse Table),是处理静态 RMQ 问题的一种高效算法(可重复贡献问题)。

对于无法进行相加减得到区间答案的问题,如 \(\max,\min\),并且区间重叠对答案不受影响的(加或减就不是),可使用 ST 表来求解 RMQ。

令 \(dp_{i,j}\) 为以 \(i\) 为起点,往右 \(2^j\) 个单位的极值是多少。

那么就可以用 \(dp_{i,j-1}\) 和 \(dp_{i+(1<<j-1),j-1}\) 求极值。

单词询问时,就像扣了两锅盖,把两个锅盖求极值就好了!

优点:单次询问是 \(O(1)\) 的

缺点:无法在低时间复杂度修改 ST 表

所以,能用 ST 表就不用线段树(常数之王)!

例题:最近公共祖先(LCA)

方法 ( \(T\) 次询问)

1. 暴力法

记录深度,把深度较深的节点向上移动

时间复杂度:\(O(Tn)\)

2. 倍增

预处理每个节点向上 \(2^k\) 层的祖先

查询时通过二进制跳跃快速找到 \(\operatorname{LCA}\)

dp[i][j] = dp[dp[i][j-1]][j-1];

时间复杂度:\(O(T\log_2n)\)

3.dfs 序

对树进行 \(dfs\) 遍历,记录访问顺序和深度

记录每个节点首次出现的位置

用 \(ST\) 表来求出两个节点 dfs 序之间深度最小的节点

时间复杂度:\(O(n \log _2n + T)\)

代码(倍增):

#include <bits/stdc++.h>using namespace std;
const int N = 5e5 + 7;
const int LOG_N = 21;
int f[N][LOG_N],dep[N];
vector<int>ve[N];
inline void dfs(int u,int fa){for(auto v : ve[u]){if(v == fa) continue;dep[v] = dep[u] + 1;f[v][0] = u;dfs(v,u);}return;
}
int get_lca(int x,int y){if(dep[x] < dep[y]) swap(x,y);int d = dep[x] - dep[y];for(int i = 0;d;i++,d >>= 1){if(d & 1){x = f[x][i];}}if(x != y){for(int i = 20;i >= 0;i--){if(f[x][i] != f[y][i]){x = f[x][i];y = f[y][i];}}x = f[x][0];	}return x;
}
int n,m,s;
int main(){scanf("%d%d%d",&n,&m,&s);for(int i = 1,x,y;i < n;i++){scanf("%d%d",&x,&y);ve[x].push_back(y);ve[y].push_back(x);}dep[s] = 1;dfs(s,s);for(int j = 1;j <= 20;j++){for(int i = 1;i <= n;i++){f[i][j] = f[f[i][j-1]][j-1];}}for(int u,v;m--;){scanf("%d%d",&u,&v);printf("%d\n",get_lca(u,v));}return 0;
}

相关新闻

  • 10-27 CSP 赛前比赛记录
  • P3939 数颜色
  • AI开发微信小程序-有感

最新新闻

  • args4j子命令实现指南:如何构建类似git的复杂命令行接口
  • c12测试策略终极指南:配置加载的单元测试与集成测试完全解析
  • Self-Replace案例研究:知名开源项目如何使用这个库实现无缝更新
  • 普陀装修指南:八家上海装修公司综合观察 - 资讯焦点
  • Arduino ESP32完整安装教程:从零开始构建物联网开发环境
  • 阿甘|张家界纯玩领队,8年只做一件事:带你好好玩张家界 - 资讯焦点

日新闻

  • 2026年不锈钢卷板厂家推荐排行榜:冷轧热轧/304/201不锈钢卷板,高颜值耐腐蚀源头厂家实力精选 - 企业推荐官【官方】
  • FLUX.1-dev FP8模型实战指南:24GB以下显卡高效部署方案
  • 2026佛山长途搬家价目表:跨省跨市搬家费用完整计算指南 - 从来都是英雄出少年

周新闻

  • 3步解锁iOS设备:applera1n激活锁绕过完全指南
  • 39 2026 人工智能证书终极盘点,普通人选 AI 证书可以从这些方向入手
  • Redis 暴露公网有多危险?从端口检查到补救步骤

月新闻

  • 【总结】入门篇:50句话让你记住架构核心概念
  • WeChatMsg技术方案解析:实现Mac微信数据自主管理的完整解决方案
  • WeChatMsg:革新性微信数据备份方案,打造你的专属数字记忆库

关于尧图

  • 公司简介
  • 团队介绍
  • 企业文化
  • 荣誉资质

服务项目

  • 定制开发
  • 电商建站
  • UI 设计
  • 运维服务

快速链接

  • 案例展示
  • 建站流程
  • 常见问题
  • 资讯中心

联系方式

  • 📍北京市朝阳区互联网产业园 A 座 10 层
  • 📞400-888-8888
  • ✉️contact@rkmt.cn
  • 🕐周一至周日 9:00-21:00

© 2024 北京尧图网络科技有限公司 版权所有 | 京 ICP 备 XXXXXXXX 号