RMQ & ST
1. 什么是
是英文 的缩写,顾名思
义是用来求某个区间内的最大值或最小值,通常用在要多次询问一些
的问题中。
2. 求解 问题
今天我们要用的是—— 表。
注意的是,ST表只用于静态区间求最值,而动态区间就只能用 线段树 或 树状数 组 了。
3. 表
表的功能很简单
它是解决 问题(区间最值问题)的一种强有力的工具
它可以做到 预处理, 查询最值
算法思想
ST表是利用的是 的思想
拿最大值来说
我们用 表示,以 位置为起点的 个数中的最大值,例如 表
示的是 以 位置为起点的 个数中的最大值,即 位置和 位置中两个数的最
大值
初始化
那么转移的时候我们可以把当前区间拆成两个区间并分别取最大值
查询时我们先计算出
然后对于左端点和右端点分别进行查询,这样可以保证一定可以覆盖查询的区间
则
#include <bits/stdc++.h>
using namespace std;
#define max(a, b) a > b ? a : b
const int maxn = 1e5 + 5;
int n, m;
int a[maxn][21];
int lg[maxn];
void update()
{
for (int j = 1; (1 << j) <= n; j++)
{
for (int i = 1; i + (1 << j) - 1 <= n; i++)
{
a[i][j] = max(a[i][j - 1], a[i + (1 << (j - 1))][j - 1]);
}
}
}
int query(int l, int r)
{
int t = lg[r - l + 1] - 1;
return max(a[l][t], a[r - (1 << t) + 1][t]);
}
signed main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++)
{
cin >> a[i][0];
}
for (int i = 1; i <= n; ++i)
{
lg[i] = lg[i - 1] + (1 << lg[i - 1] == i);
}
update();
for (int i = 1; i <= m; i++)
{
int l, r;
cin >> l >> r;
cout << query(l, r) << endl;
}
}
本文来自博客园,作者:蒟蒻orz,转载请注明原文链接:https://www.cnblogs.com/orzz/p/18122182
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 分享一个免费、快速、无限量使用的满血 DeepSeek R1 模型,支持深度思考和联网搜索!
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· ollama系列01:轻松3步本地部署deepseek,普通电脑可用
· 按钮权限的设计及实现
· 25岁的心里话