首页 > 代码库 > poj2019(二维RMQ)
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)
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。