题解:P3865 【模板】ST 表 && RMQ 问题

思路

ST表是一种基于倍增思想的预处理算法。

倍增算法的用处:
变化了k次,k次之后是啥
用了二进制的思想
st[s][i] s是起点,跳2^i步
位运算时间复杂度为O(1)

推荐阅读资料:https://oi-wiki.org/ds/sparse-table/

AC代码

#include <bits/stdc++.h>
using namespace std;
using ll = long long;
const int MAXN = 1e6 + 10;
int st[MAXN][21];

int query(int l, int r) {
	int k = log2(r - l + 1);
	return max(st[l][k], st[r - (1 << k)+1][k]);
}

int main() {
//	freopen("text.in","r",stdin);
//	freopen("text.out","w",stdout);
	ios::sync_with_stdio(0), cout.tie(0), cin.tie(0);
	int N, M;
	cin >> N >> M;
	for (int i = 1; i <= N; i++) {
		cin >> st[i][0];
	}
	for (int j = 1; j <= 21; 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]);
		}
	}
	for (int i = 1; i <= M; i++) {
		int l, r;
		cin >> l >> r;
		cout << query(l, r) << '\n';
	}
    return 0;
}
posted @ 2025-03-02 14:45  Zheng_iii  阅读(32)  评论(0)    收藏  举报