Cornfields
Time Limit: 1000MS   Memory Limit: 30000K
Total Submissions: 5516   Accepted: 2714

Description

FJ has decided to grow his own corn hybrid in order to help the cows make the best possible milk. To that end, he's looking to build the cornfield on the flattest piece of land he can find.

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

* Line 1: Three space-separated integers: N, B, and K.

* 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

* Lines 1..K: A single integer per line representing the difference between the max and the min in each query. 

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
 
二维RMQ问题 
矩形解法:
#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的更多相关文章

  1. POJ 2019 Cornfields [二维RMQ]

    题目传送门 Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 7963   Accepted: 3822 ...

  2. POJ 2019 Cornfields (二维RMQ)

    Cornfields Time Limit: 1000MS   Memory Limit: 30000K Total Submissions: 4911   Accepted: 2392 Descri ...

  3. POJ 2019 Cornfields(二维RMQ)

    相比以前的RMQ不同的是,这是一个二维的ST算法 #include<iostream> #include<cstring> #include<cstdio> #in ...

  4. POJ 2019 Cornfields 二维线段树的初始化与最值查询

    模板到不行.. 连更新都没有.. .存个模板. 理解留到小结的时候再写. #include <algorithm> #include <iostream> #include & ...

  5. Cornfields POJ - 2019(二维RMQ板题)

    就是求子矩阵中最大值与最小值的差... 板子都套不对的人.... #include <iostream> #include <cstdio> #include <sstr ...

  6. poj 2019 二维rmq *

    题目大意:给出一个N*N矩形,每个格子上有一个价值.询问一个b*b的矩形在左上角的位置(x,y),(x+b-1,y+b-1)这一部分的最大值-最小值是多少. 模板题 #include <stdi ...

  7. 二维 ST POJ 2019

    题目大意:给你一个n*n的矩阵,每次给你一个点(x,y),以其为左上角,宽度为b的矩阵中最小的数值和最大数值的差是多少?  一共k个询问. 思路:简单的二维st. 定义dp(i,j,k,L)表示以(i ...

  8. POJ 2019

    简单的RMQ,可我怎么写都WA.不明白,找了一个和我相似的贴过了,要赶着去外婆家. #include <iostream> #include <algorithm> #incl ...

  9. poj 动态规划题目列表及总结

    此文转载别人,希望自己能够做完这些题目! 1.POJ动态规划题目列表 容易:1018, 1050, 1083, 1088, 1125, 1143, 1157, 1163, 1178, 1179, 11 ...

随机推荐

  1. Codevs 1069 关押罪犯 2010年NOIP全国联赛提高组

    1069 关押罪犯 2010年NOIP全国联赛提高组 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 钻石 Diamond 题目描述 Description S 城现有两座监狱,一共 ...

  2. ajax查询数据返回结果不变

    在使用流水号的时候,Google浏览器没有问题,但是IE有缓存,如果ajax请求的参数没有变化,那么就会返回缓存里的数据 解决方法:ajax请求的时候传值的参数设置一个时间戳就OK了(没什么特别意义, ...

  3. [翻译]log4net教程

    原文:log4net Tutorial 一.基础: log4net分为三部分:配置.设置和调用.配置通常是在app.webconfig或web.config文件中:为了增加灵活性,我们也可以使用单独的 ...

  4. sql 修改字段小记

    增加字段默认值: alter table 表名 ADD 字段 类型 NULL Default 0 修改字段类型: alter table 表名 alter column UnitPrice decim ...

  5. js组件开发流程

    html代码 <div id="div1"></div> <div id="div2"></div> <d ...

  6. phpcms v9后台多表查询分页代码

    phpcms v9里面自带的listinfo分页函数蛮好用的,可惜啊.不支持多表查询并分页. 看了一下前台模板层支持get标签,支持多表查询,支持分页.刚好可以把这个功能搬到后台来使用. 我们现在对g ...

  7. about家庭智能设备部分硬件模块功能共享【协同工作】solution

    本人设备列表: Onda tablet {Android} wifi Desktop computer {win7.centos7} 外接蓝牙adapter PS interface 键盘.鼠标{与同 ...

  8. Centos 6.2 32位机器安装新的JDK和Weblogic

    一.首先卸载自带的JDK 1.查看自带的java版本. root@admin]#java -version java version "1.6.0" OpenJDK Runtime ...

  9. LCA——倍增求解

    LCA,即最近公共祖先,用于解决树上两点的最近公共祖先问题. ; lca(1,2)=3;(原谅我的绘画水平) LCA的求解有三种算法(我知道的)——tarjan,倍增,线段树(我只会两种),NOIp之 ...

  10. <一> SQL 基础

    删除数据库 drop database database-name 创建新表格 create table tablename (col1 type1 [not null] [primary key], ...