首页 > 代码库 > 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)