[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 ...
随机推荐
- ubuntu下编译安装PHP
首先配置configure // ./configure --prefix=/usr/local/php5 --with-apxs2=/usr/local/apache2/bin/apxs --wit ...
- starling 中 的特效
一. 最好用同一张图片进行缩放变形等处理后组合,这样可以每帧一draw
- 判断浏览器是否支持某个css3属性的javascript方法
判断浏览器是否支持css3某个属性的方法: /** * 判断浏览器是否支持某一个CSS3属性 * @param {String} 属性名称 * @return {Boolean} true/false ...
- iOS之RunTime浅谈
首先说一下什么是runtime:RunTime简称运行时.就是系统在运行的时候的一些机制,其中最主要的是消息机制.对于C语言,函数的调用 在编译的时候会决定调用哪个函数( C语言的函数调用请看这里 ) ...
- [PHP]htmlentities() 函数
定义和用法 htmlentities() 函数把字符转换为 HTML 实体. 语法 htmlentities(string,quotestyle,character-set) 参数 描述 string ...
- php curl request
/** * @desc curl request请求 * @date 2016-12-07 16:26:55 * * @param $arguments * * @return bool|mixed ...
- PHP 向 MySql 中数据修改操作时,只对数字操作有效,非数字操作无效,怎么办?
问题描述: 用PHP向MySql数据库中修改数据,实现增删改(数据库能正确连接) 经测试,代码只能对数字进行正常的增删改操作,非数字操作无效 但要在课程名称中输入中文,应该如果修改呢? 存 ...
- PHP初学留神(二)
1.===比较运算符 记得上上篇中说过===与==的问题.当时说,===还要类型相同.但到底是怎样呢?因为我们知道比较运算符是可以把两个值类型转换的.举个栗子,如果一个数字和字符串比较,则字符串会转化 ...
- git fork同步原作者
从github上获取源代码,一种是直接下载,但是无法改动后提交. 一种是fork一下,但是和原作者同步麻烦. 所以我找到了四个命令,解决同步问题. 以后建议大家fork一下,主要是哪天对源码熟悉了,想 ...
- 2016031901 - U盘安装ubuntu系统
使用U盘安装ubuntu系统 01.进入u盘安装 个人使用的是闪迪U盘安装 02. 个人重装ubuntu 03.进入ubuntu安装界面 04.进入语言界面 05.准备安装ubuntu 06.ubun ...