poj2019(二维RMQ)
Posted yijiull
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了poj2019(二维RMQ)相关的知识,希望对你有一定的参考价值。
题目连接:http://poj.org/problem?id=2019
只是增加一个维度,类比一维即可。
1 #include<cstdio> 2 #include<cstring> 3 #include<cmath> 4 #include<algorithm> 5 using namespace std; 6 const int maxn=270; 7 int p[maxn][maxn]; 8 int pmax[maxn][maxn][20]; 9 int pmin[maxn][maxn][20]; 10 int n,b,k; 11 12 void RMQ_INIT() 13 { 14 int f=log(n+0.0)/log(2.0); 15 for(int i=1;i<=n;i++) 16 for(int j=1;j<=n;j++) 17 pmax[i][j][0]=pmin[i][j][0]=p[i][j]; 18 for(int i=1;i<=n;i++) 19 for(int k=1;k<=f;k++) 20 for(int j=1;j+(1<<k)-1<=n;j++) 21 { 22 pmax[i][j][k]=max(pmax[i][j][k-1],pmax[i][j+(1<<k-1)][k-1]); 23 pmin[i][j][k]=min(pmin[i][j][k-1],pmin[i][j+(1<<k-1)][k-1]); 24 } 25 return; 26 } 27 28 29 int rmq(int r,int c) 30 { 31 int l=c,rr=c+b-1; 32 int k=log(b+0.0)/log(2.0); 33 int maxx=-0x3f3f3f3f,minn=0x3f3f3f3f; 34 for(int i=r;i<r+b;i++) 35 { 36 maxx=max(maxx,max(pmax[i][l][k],pmax[i][rr-(1<<k)+1][k])); 37 minn=min(minn,min(pmin[i][l][k],pmin[i][rr-(1<<k)+1][k])); 38 } 39 return maxx-minn; 40 } 41 int main() 42 { 43 while(scanf("%d%d%d",&n,&b,&k)!=EOF) 44 { 45 for(int i=1;i<=n;i++) 46 for(int j=1;j<=n;j++) 47 scanf("%d",&p[i][j]); 48 RMQ_INIT(); 49 int r,c; 50 while(k--) 51 { 52 scanf("%d%d",&r,&c); 53 printf("%d\n",rmq(r,c)); 54 } 55 } 56 57 }
以上是关于poj2019(二维RMQ)的主要内容,如果未能解决你的问题,请参考以下文章