今天下午大帝讲的,我以前也不懂,所以也就跟着学学了,把中间的那个状态转移方程学错了好几次,于是就wa了
好几发。
#include<iostream> #include<cstdio> #include<algorithm> #define maxn 200010 using 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; }
POJ 3264 RMQ Spare Table算法,布布扣,bubuko.com
原文:http://blog.csdn.net/u011041349/article/details/38589599