RMQ板子

来源:互联网 发布:tensorflow 教程 编辑:程序博客网 时间:2024/04/28 05:17

最近想学LCA。看了ST算法之后,发现其中是要用到RMQ的。虽然以前我专门练过RMQ,然而经过一段时间,时间已经将我的记忆消磨殆尽。看来我还是需要多加复习,否则之前学的东西都会忘掉了。
自己瞎编的RMQ板子:

//h==0:取[l,r]的最大值h==1:取[l,r]的最小值 #include<cstdio>#include<cmath>#include<cstring>#define max(a,b) a>b?a:b#define min(a,b) a<b?a:bint n,i,j,l,r,x,h;int a[10001];int f[10001][15];int ff[10001][15];main(){    scanf("%d",&n);    for(i=1;i<=n;i++)      scanf("%d",&a[i]);    memset(ff,10,sizeof(ff));    for(i=1;i<=n;i++)    {        f[i][0]=a[i];        ff[i][0]=a[i];    }    for(j=1;j<=log(n)/log(2);j++)      for(i=1;i<=n+1-1<<j;i++)      {        f[i][j]=max(f[i][j-1],f[i+(1<<(j-1))][j-1]);        ff[i][j]=min(ff[i][j-1],ff[i+(1<<(j-1))][j-1]);      }    scanf("%d",&n);    for(i=1;i<=n;i++)    {        scanf("%d%d%d",&h,&l,&r);        x=log(r-l+1)/log(2);        if(h==0) printf("%d\n",max(f[l][x],f[r+1-(1<<x)][x]));        else printf("%d\n",min(ff[l][x],ff[r+1-(1<<x)][x]));    }}
0 0
原创粉丝点击