RMQ(ST表)
RMQ (ST表)
解决区间最大(最小)问题,比起线段树的优点是在预处理log之后 查询是的
//不预处理log的话也只需要使用一个log函数, 效率较高 可以看做是O(1)
缺点 不能进行修改
题意概述:给定一个长度为的序列 ,次询问,每次求 区间中的最大值
实现过程类似动态规划
表示从 开始 长度为 的区间的最大值
= ;
#include<bits/stdc++.h>
using namespace std;
const int N = 200010;
int n;
int a[200010];
int f[200010][18];
void init(){
for(int j = 0; j <= 17; j++)
for(int i = 1; i + (1 << j) - 1 <= n;i ++){
if(!j) f[i][j] = a[i];
else f[i][j] = max(f[i][j - 1], f[i + (1 << (j - 1))][j - 1]);
}
}
int main()
{
cin >> n;
for(int i = 1; i <= n ;i ++)scanf("%d", &a[i]);
init();
int m;
cin >> m;
while(m--){
int l, r;
scanf("%d%d", &l, &r);
int len = r - l + 1;
int k = __lg(len);
cout << max(f[l][k], f[r - (1 << k) + 1][k]) << endl;
}
}
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】凌霞软件回馈社区,博客园 & 1Panel & Halo 联合会员上线
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】博客园社区专享云产品让利特惠,阿里云新客6.5折上折
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步