理想的正方形

省队选拔赛河南

 时间限制: 1 s
 空间限制: 256000 KB
 题目等级 : 大师 Master
 
 
 
题目描述 Description

有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。

输入描述 Input Description

第一行为3个整数,分别表示a,b,n的值

第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。

输出描述 Output Description

仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。

样例输入 Sample Input

5 4 2

1 2 5 6

0 17 16 0

16 17 2 1

2 10 2 1

1 2 2 2

样例输出 Sample Output

1

数据范围及提示 Data Size & Hint

(1)矩阵中的所有数都不超过1,000,000,000

(2)20%的数据2<=a,b<=100,n<=a,n<=b,n<=10

(3)100%的数据2<=a,b<=1500,n<=a,n<=b,n<=100

/*
嗯,脑补二维RMQ fail,挂成暴力分。
一维是维护一个区间,二维是维护一个矩阵。
由于这个题是小正方形,三维数组即可。二维RMQ略麻烦...
*/
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib> #define x2 x1+n-1-(1<<m)+1
#define y2 y1+n-1-(1<<m)+1 using namespace std;
void read(int &x)
{
int f=;x=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+c-'';c=getchar();}
x*=f;
} void out(int x)
{
if(!x){putchar('');return;}
if(x<){x=~x+;putchar('-');}
char c[]= {};
while(x)c[++c[]]=x%+,x/=;
while(c[])putchar(c[c[]--]);
}
const int inf=1e3+;
int i,j,k,m;
int g[inf][inf][];
int f[inf][inf][];
int x,y,n;
int ans=0x7fffffff; int query(int x1,int y1)
{
int maxn=,minn=0x7fffffff;
maxn=max(f[x1][y1][m],f[x2][y2][m]);
maxn=max(maxn,f[x1][y2][m]);
maxn=max(maxn,f[x2][y1][m]);
minn=min(g[x1][y1][m],g[x2][y2][m]);
minn=min(minn,g[x1][y2][m]);
minn=min(minn,g[x2][y1][m]);
return maxn-minn;
} int main()
{
read(y);read(x);
read(n);m=log(n)/log();
for(i=; i<=y; i++)
for(j=; j<=x; j++)
{
read(f[j][i][]);
g[j][i][]=f[j][i][];
}
for(k=; k<=; k++)
for(i=; i+(<<k)-<=x; i++)
for(j=; j+(<<k)-<=y; j++)
{
f[i][j][k]=max(f[i][j][k-],f[i+(<<(k-))][j+(<<(k-))][k-]);
f[i][j][k]=max(f[i][j][k],f[i+(<<(k-))][j][k-]);
f[i][j][k]=max(f[i][j][k],f[i][j+(<<(k-))][k-]);
g[i][j][k]=min(g[i][j][k-],g[i+(<<(k-))][j+(<<(k-))][k-]);
g[i][j][k]=min(g[i][j][k],g[i+(<<(k-))][j][k-]);
g[i][j][k]=min(g[i][j][k],g[i][j+(<<(k-))][k-]);
}
for(i=; i+n-<=x; i++)
for(j=; j+n-<=y; j++)
ans=min(ans,query(i,j));
out(ans);
return ;
}

理想的正方形 HAOI2007(二维RMQ)的更多相关文章

  1. 【洛谷2216】[HAOI2007] 理想的正方形(二维RMQ)

    点此看题面 大致题意: 求出一个矩阵中所有\(n*n\)正方形中极差的最小值. 另一种做法 听说这题可以用单调队列去做,但是我写了一个二维\(RMQ\). 二维\(RMQ\) \(RMQ\)相信大家都 ...

  2. P2216 [HAOI2007]理想的正方形(二维RMQ)

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...

  3. [HAOI2007]理想的正方形 BZOJ1047 二维RMQ

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...

  4. 【洛谷 P2216】 [HAOI2007]理想的正方形(二维ST表)

    题目链接 做出二维\(ST\)表,然后\(O(n^2)\)扫一遍就好了. #include <cstdio> #include <cstring> #include <a ...

  5. [luoguP2216] [HAOI2007]理想的正方形(二维单调队列)

    传送门 1.先弄个单调队列求出每一行的区间为n的最大值最小值. 2.然后再搞个单调队列求1所求出的结果的区间为n的最大值最小值 3.最后扫一遍就行 懒得画图,自己体会吧. ——代码 #include ...

  6. 【bzoj1047】[HAOI2007]理想的正方形 二维RMQ

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...

  7. 【LightOJ 1081】Square Queries(二维RMQ降维)

    Little Tommy is playing a game. The game is played on a 2D N x N grid. There is an integer in each c ...

  8. hdu2888 二维RMQ

    Check Corners Time Limit: 2000/10000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others) T ...

  9. hduacm 2888 ----二维rmq

    http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题  直接用二维rmq 读入数据时比较坑爹  cin 会超时 #include <cstdio& ...

随机推荐

  1. 《 阿Q正传》-鲁迅 词语解释 | 经典语录

    词语解释 “太上有立德,其次是立功,其次是立言,虽久不废,此之谓不朽”.-出自<左传>-左丘明(春秋末期) 解释:(1)最上等的是树立德行,其次是建功立业,再其次是创立学说,即使过了很久也 ...

  2. Mysql Replace语句的使用

    Mysql Replace语句的语法: REPLACE [LOW_PRIORITY | DELAYED] [INTO] tbl_name [(col_name,...)] VALUES ({expr ...

  3. easyUI pagination分页控件点击下一页后跳转到最后一页

    easyui-pagination点击下一页直接跳转到最后一页的可能原因 今天做到聊天记录展示页面的时候发现一个bug:初次进入页面加载出第一页的数据,点击下一页的时候不是到第二页而是到最后一页. 如 ...

  4. JVM 总结

    面试 java 虚拟机 jvm 基础 jvm Write Once Run EveryWhere >jar 包可以在任何兼容jvm上运行 >jvm 适配器 屏蔽掉底层差异 >内存管理 ...

  5. Linux系统备份还原工具4(rsync/远程数据同步工具)

    rsync即是能备份系统也是数据同步的工具. 在Jenkins上可以使用rsync结合SSH的免密登录做数据同步和分发.这样一来可以达到部署全命令化,不需要依赖任何插件去实现. 命令参考:http:/ ...

  6. Android 原生开发、H5、React-Native使用利弊和场景技术分享

    http://m.blog.csdn.net/article/details?id=51778086 发表于2016/6/28 18:52:46  1176人阅读      最近工作中接触到React ...

  7. MongoDB小结22 - id生成规则

    MongoDB的文档必须有一个_id键. 目的是为了确认在集合里的每个文档都能被唯一标识. ObjectId 是 _id 的默认类型. ObjectId 采用12字节的存储空间,每个字节两位16进制数 ...

  8. Bug记载2之Vue.JS路由定义的位置

    <!DOCTYPE html><html lang="en"> <head> <meta charset="UTF-8" ...

  9. no matching function transform?

    http://stackoverflow.com/questions/19876746/stdtolower-and-visual-studio-2013 http://forums.codeguru ...

  10. 【转】深入理解javascript作用域——词法作用域和动态作用域

    前面的话 大多数时候,我们对作用域产生混乱的主要原因是分不清楚应该按照函数位置的嵌套顺序,还是按照函数的调用顺序进行变量查找.再加上this机制的干扰,使得变量查找极易出错.这实际上是由两种作用域工作 ...