POJ 3264 RMQ Spare Table算法

来源:互联网 发布:jquery.js文件下载 编辑:程序博客网 时间:2024/06/05 22:41

   

  今天下午大帝讲的,我以前也不懂,所以也就跟着学学了,把中间的那个状态转移方程学错了好几次,于是就wa了


好几发。

   

#include<iostream>#include<cstdio>#include<algorithm>#define maxn 200010using namespace std;int a[maxn],m,n,b[maxn],fl[maxn][50],fr[maxn][50];void solve(){    b[1]=0;//其实就是用来计算除以log2的值    for(int i=2;i<=m;i++)    {        b[i]=b[i-1];        if((1<<b[i]+1)==i) b[i]++;    }    for(int i=0;i<m;i++)  fl[i][0]=fr[i][0]=a[i];    for(int i=m-1;i>=0;i--)        for(int j=1;i+(1<<j)-1<m;j++)//容易出错的地方        {           fl[i][j]=min(fl[i][j-1],fl[i+(1<<j-1)][j-1]);           fr[i][j]=max(fr[i][j-1],fr[i+(1<<j-1)][j-1]);        }}int qma(int l,int r){    int len=(r-l+1);    int k=b[len];    return  max(fr[l][k],fr[r-(1<<k)+1][k]);}int qmi(int l,int r){    int len=r-l+1;    int k=b[len];    return min(fl[l][k],fl[r-(1<<k)+1][k]);}int main(){    scanf("%d%d",&m,&n);    for(int i=0;i<m;i++) cin>>a[i];    solve();    while(n--)          {              int u,v;              cin>>u>>v;              u--;              v--;            printf("%d\n",qma(u,v)-qmi(u,v));          }    return 0;}

0 0