码迷,mamicode.com
首页 > 其他好文 > 详细

poj2019(二维RMQ)

时间:2017-04-24 00:59:19      阅读:143      评论:0      收藏:0      [点我收藏+]

标签:log   二维rmq   ace   std   while   can   namespace   color   const   

题目连接: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)

标签:log   二维rmq   ace   std   while   can   namespace   color   const   

原文地址:http://www.cnblogs.com/yijiull/p/6754787.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!