RMQ(ST表)

RMQ (ST表)

解决区间最大(最小)问题,比起线段树的优点是在预处理log之后 查询是O(1)

//不预处理log的话也只需要使用一个log函数, 效率较高 可以看做是O(1)

缺点 不能进行修改

原题链接

题意概述:给定一个长度为n的序列 ,m次询问,每次求l,r 区间中的最大值

实现过程类似动态规划

f(i,j) 表示从 i 开始 长度为2j 的区间的最大值

f(i,j) = max(f(i,j1),f(i+2j1,j1));

#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;
        
    }

}
posted @   通宵  阅读(49)  评论(0编辑  收藏  举报
点击右上角即可分享
微信分享提示