A12 ST表 RMQ问题

视频链接:A12 ST表 RMQ问题_哔哩哔哩_bilibili

 

 

Luogu P3865 【模板】ST 表

// ST表 RMQ O(nlogn)
#include<bits/stdc++.h>
#define rep(i,l,r) for(int i=l;i<=r;++i)
using namespace std;

const int N=1e5+5;
int n,m;
int f[N][22]; //f[i][j]表示起点为i,长度为2^j的区间最大值
int lg[N];    //lg[x]表示区间长度的对数

int main(){
  scanf("%d%d",&n,&m);
  rep(i,1,n) scanf("%d",&f[i][0]);
  rep(i,2,n) lg[i]=lg[i>>1]+1;
  
  rep(j,1,lg[n]) //枚举区间长度的对数
    rep(i,1,n-(1<<j)+1) //枚举区间起点为 i。终点为 i+2^j-1
      f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]); //后半区起点为 i+2^(j-1)。[2,5]=[2,3]+[4,5]
  
  rep(i,1,m){
    int l,r; scanf("%d%d",&l,&r);
    int j=lg[r-l+1]; //区间长度的对数
    printf("%d\n",max(f[l][j],f[r-(1<<j)+1][j])); //后段起点为 r-2^j+1。[1,6]~[1,4]+[3,6]
  }
}

 

练习:

Luogu P1440 求m区间内的最小值

Luogu P1816 忠诚

Luogu P2251 质量检测

Luogu P2880 [USACO07JAN] Balanced Lineup G

 

posted @ 2023-07-05 19:53  董晓  阅读(1829)  评论(1)    收藏  举报