RMQ
# RMQ
# ST表
ST 表基于倍增思想,可以做到 预处理, 回答每个询问。来处理区间最大值或者区间 gcd 问题,但是不支持修改操作
定义 表示区间 的最大值,显然
根据定义式,第二维就相当于倍增的时候跳了 步
所以预处理的转移方程自然而然就可以得出了:
对于每个询问 我们分成两部分: 与 ,其中
#include <bits/stdc++.h>
using namespace std;
int main() {
freopen ("P3865.in", "r", stdin);
int n, m; cin >> n >> m;
vector<int> a(n + 1);
for (int i = 1; i <= n; i++)
cin >> a[i];
vector<vector<int> > f(n + 1, vector<int>(20));
vector<int> lg2(n + 1, 0);
for (int i = 1; i <= n; i++)
f[i][0] = a[i];
for (int i = 2; i <= n; i++)
lg2[i] = lg2[i >> 1] + 1;
for (int j = 1; j < 20; j++)
for (int i = 1; i + (1 << j) - 1 <= n; i++)
f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
auto query = [&] (int l, int r) {
int s = lg2[r - l + 1];
return max(f[l][s], f[r - (1 << s) + 1][s]);
};
while (m--) {
int l, r; cin >> l >> r;
cout << query(l, r) << '\n';
}
return 0;
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
上次更新: 2024/09/18, 12:58:40