[POJ 2019] Cornfields
| Time Limit: 1000MS | Memory Limit: 30000K | |
| Total Submissions: 5516 | Accepted: 2714 |
Description
FJ has, at great expense, surveyed his square farm of N x N hectares (1 <= N <= 250). Each hectare has an integer elevation (0 <= elevation <= 250) associated with it.
FJ will present your program with the elevations and a set of K (1 <= K <= 100,000) queries of the form "in this B x B submatrix, what is the maximum and minimum elevation?". The integer B (1 <= B <= N) is the size of one edge of the square cornfield and is a constant for every inquiry. Help FJ find the best place to put his cornfield.
Input
* Lines 2..N+1: Each line contains N space-separated integers. Line 2 represents row 1; line 3 represents row 2, etc. The first integer on each line represents column 1; the second integer represents column 2; etc.
* Lines N+2..N+K+1: Each line contains two space-separated integers representing a query. The first integer is the top row of the query; the second integer is the left column of the query. The integers are in the range 1..N-B+1.
Output
Sample Input
5 3 1
5 1 2 6 3
1 3 5 2 7
7 2 4 6 1
9 9 8 6 5
0 6 9 3 9
1 2
Sample Output
5
#include <iostream>
#include <cstdio>
#include <cmath>
using namespace std;
#define N 255 int n,b,k;
int val[N][N];
int mx[N][N][][];
int mi[N][N][][]; void ST(int n,int m)
{
int i,j,r,c;
for(i=;i<=n;i++)
{
for(j=;j<=m;j++)
{
mx[i][j][][]=mi[i][j][][]=val[i][j];
}
}
int kn=(int)(log(double(n))/log(2.0));
int km=(int)(log(double(m))/log(2.0));
for(i=;i<=kn;i++)
{
for(j=;j<=km;j++)
{
if(i== && j==) continue;
for(r=;r+(<<i)-<=n;r++)
{
for(c=;c+(<<j)-<=m;c++)
{
if(i==)
{
mx[r][c][i][j]=max(mx[r][c][i][j-],mx[r][c+(<<(j-))][i][j-]);
mi[r][c][i][j]=min(mi[r][c][i][j-],mi[r][c+(<<(j-))][i][j-]);
}
else
{
mx[r][c][i][j]=max(mx[r][c][i-][j],mx[r+(<<(i-))][c][i-][j]);
mi[r][c][i][j]=min(mi[r][c][i-][j],mi[r+(<<(i-))][c][i-][j]);
}
}
}
}
}
} int RMQ(int r1,int c1,int r2,int c2)
{
int kr=(int)(log(double(r2-r1+))/log(2.0));
int kc=(int)(log(double(c2-c1+))/log(2.0)); int t1=mx[r1][c1][kr][kc];
int t2=mx[r2-(<<kr)+][c1][kr][kc];
int t3=mx[r1][c2-(<<kc)+][kr][kc];
int t4=mx[r2-(<<kr)+][c2-(<<kc)+][kr][kc]; int m1=mi[r1][c1][kr][kc];
int m2=mi[r2-(<<kr)+][c1][kr][kc];
int m3=mi[r1][c2-(<<kc)+][kr][kc];
int m4=mi[r2-(<<kr)+][c2-(<<kc)+][kr][kc]; return max(max(t1,t2),max(t3,t4))-min(min(m1,m2),min(m3,m4));
} int main()
{
int i,j;
scanf("%d%d%d",&n,&b,&k);
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
scanf("%d",&val[i][j]);
}
}
ST(n,n);
while(k--)
{
int r1,c1,r2,c2;
scanf("%d%d",&r1,&c1);
r2=r1+b-;
c2=c1+b-;
printf("%d\n",RMQ(r1,c1,r2,c2));
}
return ;
}
正方形解法:
#include <stdio.h>
#include <iostream>
#include <math.h>
using namespace std;
#define inf 0x7fffffff
#define N 255
#define max(a,b) a>b?a:b
#define min(a,b) a<b?a:b int n,b,k;
int val[N][N];
int mx[N][N][];
int mi[N][N][]; int getMax(int x,int y,int p)
{
int res=-inf;
res=max(res,mx[x][y][p]);
if(x+(<<p)<=n) res=max(res,mx[x+(<<p)][y][p]);
if(y+(<<p)<=n) res=max(res,mx[x][y+(<<p)][p]);
if(x+(<<p)<=n && y+(<<p)<=n) res=max(res,mx[x+(<<p)][y+(<<p)][p]);
return res;
}
int getMin(int x,int y,int p)
{
int res=inf;
res=min(res,mi[x][y][p]);
if(x+(<<p)<=n) res=min(res,mi[x+(<<p)][y][p]);
if(y+(<<p)<=n) res=min(res,mi[x][y+(<<p)][p]);
if(x+(<<p)<=n && y+(<<p)<=n) res=min(res,mi[x+(<<p)][y+(<<p)][p]);
return res;
} void ST()
{
int i,j,k;
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
mx[i][j][]=mi[i][j][]=val[i][j];
}
}
int kn=(int)(log(n*1.0)/log(2.0)); for(k=;k<=kn;k++)
{
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
mx[i][j][k]=getMax(i,j,k-);
mi[i][j][k]=getMin(i,j,k-);
}
}
}
} int RMQMAX(int x,int y,int b)
{
int p=(int)(log(b*1.0)/log(2.0));
int res=-inf;
res=max(res,mx[x][y][p]);
if(x+b-(<<p)<=n) res=max(res,mx[x+b-(<<p)][y][p]);
if(y+b-(<<p)<=n) res=max(res,mx[x][y+b-(<<p)][p]);
if(x+b-(<<p)<=n && y+b-(<<p)<=n) res=max(res,mx[x+b-(<<p)][y+b-(<<p)][p]);
return res;
} int RMQMIN(int x,int y,int b)
{
int p=(int)(log(b*1.0)/log(2.0));
int res=inf;
res=min(res,mi[x][y][p]);
if(x+b-(<<p)<=n) res=min(res,mi[x+b-(<<p)][y][p]);
if(y+b-(<<p)<=n) res=min(res,mi[x][y+b-(<<p)][p]);
if(x+b-(<<p)<=n && y+b-(<<p)<=n) res=min(res,mi[x+b-(<<p)][y+b-(<<p)][p]);
return res;
} int main()
{
int i,j;
scanf("%d%d%d",&n,&b,&k);
for(i=;i<=n;i++)
{
for(j=;j<=n;j++)
{
scanf("%d",&val[i][j]);
}
}
ST();
while(k--)
{
int x,y;
scanf("%d%d",&x,&y);
printf("%d\n",RMQMAX(x,y,b)-RMQMIN(x,y,b));
}
return ;
}
[POJ 2019] Cornfields的更多相关文章
- POJ 2019 Cornfields [二维RMQ]
题目传送门 Cornfields Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 7963 Accepted: 3822 ...
- POJ 2019 Cornfields (二维RMQ)
Cornfields Time Limit: 1000MS Memory Limit: 30000K Total Submissions: 4911 Accepted: 2392 Descri ...
- POJ 2019 Cornfields(二维RMQ)
相比以前的RMQ不同的是,这是一个二维的ST算法 #include<iostream> #include<cstring> #include<cstdio> #in ...
- POJ 2019 Cornfields 二维线段树的初始化与最值查询
模板到不行.. 连更新都没有.. .存个模板. 理解留到小结的时候再写. #include <algorithm> #include <iostream> #include & ...
- Cornfields POJ - 2019(二维RMQ板题)
就是求子矩阵中最大值与最小值的差... 板子都套不对的人.... #include <iostream> #include <cstdio> #include <sstr ...
- poj 2019 二维rmq *
题目大意:给出一个N*N矩形,每个格子上有一个价值.询问一个b*b的矩形在左上角的位置(x,y),(x+b-1,y+b-1)这一部分的最大值-最小值是多少. 模板题 #include <stdi ...
- 二维 ST POJ 2019
题目大意:给你一个n*n的矩阵,每次给你一个点(x,y),以其为左上角,宽度为b的矩阵中最小的数值和最大数值的差是多少? 一共k个询问. 思路:简单的二维st. 定义dp(i,j,k,L)表示以(i ...
- POJ 2019
简单的RMQ,可我怎么写都WA.不明白,找了一个和我相似的贴过了,要赶着去外婆家. #include <iostream> #include <algorithm> #incl ...
- poj 动态规划题目列表及总结
此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...
随机推荐
- EL表达式 入门
为了使JSP写起来更加简单. 表达式语言的灵感来自于 ECMAScript 和 XPath 表达式语言,它提供了在 JSP 中简化表达式的方法. JSP EL语言定义 E L(Expression L ...
- 13_ServletContext对象
[简介] ServletContext即Servlet上下文对象,该对象表示当前的web应用环境信息,一个Web应用只会创建一个ServletContext对象. Web容器启动的时候,它会为每个We ...
- 7zip self-extracted executable: To extract file to specific directory
1) Install 7-zip (7zS.sfx will be installed to C:\Program Files\7-Zip): http://7zsfx.solta.ru/en/ 2) ...
- 超强的ACM题目类型总结
转:初期: 一.基本算法: (1)枚举. (poj1753,poj2965) (2)贪心(poj1328,poj2109,poj2586) (3)递归和分治法. ...
- vim 的 tags 模块 与 ctags
1. 概述 一般来说,在代码中跳转,离不开 ctags. 实际上,vim 中代码跳转是由 vim tags 模块完成的,tags 模块依赖于 tags 文件. ctags(Generate tag f ...
- HTML5之Canvas画布
先上代码: <canvas width="1000" height="800">浏览器不支持HTML5!</canvas> <sc ...
- new static() 和 new self() 的区别异同
长夜漫漫啊! 今天领导本地搭建一个站.发现用PHP 5.2 搭建不起来,站PHP代码里面有很多5.3以上的部分,领导让苦逼我更改在5.2下能运行. 改着改着发现了一个地方 return new sta ...
- SQLite学习第03天:环境搭建
相比于其他数据库而言,SQLite的环境搭建十分简单,简单几步就可以完成: (1) 首先,从http://www.sqlite.org/download.html的网站上下载预编译的shell二进制文 ...
- Java官方Demo Mark
Java2D里四个重要的基类:AnimatingSurface: 动画界面基类ControlsSurface: 控制界面基类AnimatingCon ...
- 关于Active控件的电子签名 转
关于Active控件的电子签名 两种方案:一是自己制作证书,客户端安装证书后就可以识别该控件:二就是买官方的喽,在国内找verisign的代理,负责各种电子签名,任何一台浏览器都可以识别该证书.该公司 ...