ST表

来源:互联网 发布:mac键盘按键错乱 编辑:程序博客网 时间:2024/04/27 22:36

很早以前就听说区间RMQ问题可以做到O(nlog)预处理O(1)查询
就是用到了ST表
其实很类似倍增
STi,j表示第i个位置之后2i个位置的最值
预处理就用倍增的那种方法
还需要预处理出每个log2x
然后对于每个区间 令t=log2(rl+1)
那么就可以取左右两个长度为2t的区间取最值
不难证明这样一定会覆盖整个区间
比较局限的地方是只能静态查询

#include<bits/stdc++.h>using namespace std;#define N 100010#define K 18int ST[N][K],lg[N];int main(){    int n,m,i,j;    scanf("%d%d",&n,&m);    for (i=1;i<=n;i++) scanf("%d",&ST[i][0]);    for (j=1;(1<<j)<=n;j++)        for (i=1;i+(1<<j)-1<=n;i++)            ST[i][j]=max(ST[i][j-1],ST[i+(1<<(j-1))][j-1]);    for (i=1;(1<<i)<=n;i++) lg[1<<i]=i;    for (i=1;i<=n;i++) lg[i]=max(lg[i],lg[i-1]);    for (i=1;i<=m;i++){        int x,y;        scanf("%d%d",&x,&y);        int t=lg[y-x+1];        printf("%d\n",max(ST[x][t],ST[y-(1<<t)+1][t]));    }    return 0;}


Date:2017/11/8
By CalvinJin

原创粉丝点击