ST表

来源:互联网 发布:淘宝上威力大的玩具枪 编辑:程序博客网 时间:2024/04/28 17:58

ST表用于处理区间最值问题,时间复杂度可以处理到O(nlogn),用mn[i][j]表示从j到j+2^i-1的最小值,长度为2^i。j到j+2^i-1的长度为2^i,那么一半的长度就等于2^(i-1),前半段的状态表示为mn[i-1][j],后半段的长度也为2^(i-1),后半段的状态表示为mn[i-1][j+2^(i-1)].

综上可得:
mn[i][j]=min(mn[i-1][j],mn[i-1][j+2^(i-1)].

#include<cstdio>#include<algorithm>using namespace std;int a[100100];int d[100100][110]; int n,m;void rmq(){    for(int i=1;i<=m;++i)       d[i][0]=a[i];    for(int j=1; (1<<j) <=m;++j)      for(int i=1; i+ (1<<j) -1<=m;++i)         d[i][j]=min(d[i][j-1],d[i+( 1<<(j-1) )][j-1]);}int findit(int l,int r){    int kk=0;    while(  ( 1<<(kk+1) )<=r-l+1)  kk++;    return min(d[l][kk],d[r-(1<<kk)+1][kk]);}int main(){    scanf("%d",&m);    for(int i=1;i<=m;++i)       scanf("%d",&a[i]);    rmq();    int qq,pp;    scanf("%d%d",&qq,&pp);    printf("%d",findit(qq,pp));    return 0;}
原创粉丝点击