查看“︁09-进阶算法/03-ST表”︁的源代码
←
09-进阶算法/03-ST表
跳转到导航
跳转到搜索
因为以下原因,您没有权限编辑该页面:
您请求的操作仅限属于该用户组的用户执行:
用户
您可以查看和复制此页面的源代码。
== ST表 == ST 表(Sparse Table)用于解决'''可重复贡献问题'''(如区间最值、区间 GCD),预处理 <math>O(n\log n)</math>,查询 <math>O(1)</math>,但不支持修改。 === 原理 === 使用倍增思想,<math>st[i][j]</math> 表示从 <math>i</math> 开始长度为 <math>2^j</math> 的区间的答案。 === 建表 === <syntaxhighlight lang="cpp"> const int MAXN = 100005; const int LOGN = 17; // floor(log2(MAXN)) int st[MAXN][LOGN + 1]; void build(int n) { for (int i = 1; i <= n; i++) st[i][0] = a[i]; for (int j = 1; (1 << j) <= n; j++) for (int i = 1; i + (1 << j) - 1 <= n; i++) st[i][j] = max(st[i][j - 1], st[i + (1 << (j - 1))][j - 1]); } </syntaxhighlight> === 区间查询 === <syntaxhighlight lang="cpp"> // 查询区间 [l, r] 的最大值 int query(int l, int r) { int k = log2(r - l + 1); return max(st[l][k], st[r - (1 << k) + 1][k]); } </syntaxhighlight> === 预计算 log2 === <syntaxhighlight lang="cpp"> int Log2[MAXN]; void pre_log2(int n) { Log2[1] = 0; for (int i = 2; i <= n; i++) Log2[i] = Log2[i / 2] + 1; } </syntaxhighlight> [[Category:进阶算法]] [[Category:三三文档]]
返回
09-进阶算法/03-ST表
。
导航菜单
个人工具
登录
命名空间
页面
讨论
大陆简体
查看
阅读
查看源代码
查看历史
更多
搜索
导航
首页
最近更改
随机页面
MediaWiki帮助
特殊页面
工具
链入页面
相关更改
页面信息