理想的正方形

省队选拔赛河南

 时间限制: 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

  1. /*
  2. 嗯,脑补二维RMQ fail,挂成暴力分。
  3. 一维是维护一个区间,二维是维护一个矩阵。
  4. 由于这个题是小正方形,三维数组即可。二维RMQ略麻烦...
  5. */
  6. #include<iostream>
  7. #include<cstdio>
  8. #include<cstring>
  9. #include<cmath>
  10. #include<cstdlib>
  11.  
  12. #define x2 x1+n-1-(1<<m)+1
  13. #define y2 y1+n-1-(1<<m)+1
  14.  
  15. using namespace std;
  16. void read(int &x)
  17. {
  18. int f=;x=;char c=getchar();
  19. while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
  20. while(isdigit(c)){x=(x<<)+(x<<)+c-'';c=getchar();}
  21. x*=f;
  22. }
  23.  
  24. void out(int x)
  25. {
  26. if(!x){putchar('');return;}
  27. if(x<){x=~x+;putchar('-');}
  28. char c[]= {};
  29. while(x)c[++c[]]=x%+,x/=;
  30. while(c[])putchar(c[c[]--]);
  31. }
  32. const int inf=1e3+;
  33. int i,j,k,m;
  34. int g[inf][inf][];
  35. int f[inf][inf][];
  36. int x,y,n;
  37. int ans=0x7fffffff;
  38.  
  39. int query(int x1,int y1)
  40. {
  41. int maxn=,minn=0x7fffffff;
  42. maxn=max(f[x1][y1][m],f[x2][y2][m]);
  43. maxn=max(maxn,f[x1][y2][m]);
  44. maxn=max(maxn,f[x2][y1][m]);
  45. minn=min(g[x1][y1][m],g[x2][y2][m]);
  46. minn=min(minn,g[x1][y2][m]);
  47. minn=min(minn,g[x2][y1][m]);
  48. return maxn-minn;
  49. }
  50.  
  51. int main()
  52. {
  53. read(y);read(x);
  54. read(n);m=log(n)/log();
  55. for(i=; i<=y; i++)
  56. for(j=; j<=x; j++)
  57. {
  58. read(f[j][i][]);
  59. g[j][i][]=f[j][i][];
  60. }
  61. for(k=; k<=; k++)
  62. for(i=; i+(<<k)-<=x; i++)
  63. for(j=; j+(<<k)-<=y; j++)
  64. {
  65. f[i][j][k]=max(f[i][j][k-],f[i+(<<(k-))][j+(<<(k-))][k-]);
  66. f[i][j][k]=max(f[i][j][k],f[i+(<<(k-))][j][k-]);
  67. f[i][j][k]=max(f[i][j][k],f[i][j+(<<(k-))][k-]);
  68. g[i][j][k]=min(g[i][j][k-],g[i+(<<(k-))][j+(<<(k-))][k-]);
  69. g[i][j][k]=min(g[i][j][k],g[i+(<<(k-))][j][k-]);
  70. g[i][j][k]=min(g[i][j][k],g[i][j+(<<(k-))][k-]);
  71. }
  72. for(i=; i+n-<=x; i++)
  73. for(j=; j+n-<=y; j++)
  74. ans=min(ans,query(i,j));
  75. out(ans);
  76. return ;
  77. }

理想的正方形 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. C51 动态数码管 个人笔记

    8段led管构成一个数字. 开发板上共有8个数字. 每个数字有一个使能端(段选引脚) 每个数字的位选端(选择8段led管哪些亮,即构成什么图案)并联在一起 轮流点亮不同数字,速度很快,视觉暂留,从而形 ...

  2. Python接口测试之unittest框架(五)

    Test-driven development(TDD)开发模式在今天已经不是什么新奇的事了,它的开发思维是在开发一个产品功能的时候,先 编写好该功能的测试代码,在编写开发比如,比如要写二个数相除的函 ...

  3. POJ3352-Road Construction(边连通分量)

    It's almost summer time, and that means that it's almost summer construction time! This year, the go ...

  4. 【small项目】MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException:

    MySQL第二天早上第一次连接超时报错,解决方法com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link ...

  5. hdu - 1254 推箱子 (bfs+bfs)

    http://acm.hdu.edu.cn/showproblem.php?pid=1254 题目意思很简单,只要思路对就好. 首先考虑搬运工能否到达推箱子的那个点,这个可以根据箱子前进方向得出搬运工 ...

  6. Codeforces 628F Bear and Fair Set

    题意: 给定若干个上限upto以及集合中在[1,upto]中的元素个数,问是否存在这样的集合使得集合中的元素除以5的余数的个数相等. 分析: 首先可以想到区间的数与其除以5的余数和区间编号分别一一对应 ...

  7. UVA 437_The Tower of Babylon

    题意: 一堆石头,给定长宽高,每种石头均可以使用无数次,问这堆石头可以叠放的最高高度,要求下面的石头的长和宽分别严格大于上面石头的长和宽. 分析: 采用DAG最长路算法,由于长宽较大,不能直接用于表示 ...

  8. 洛谷 P1608 路径统计

    P1608 路径统计 题目描述 “RP餐厅”的员工素质就是不一般,在齐刷刷的算出同一个电话号码之后,就准备让HZH,TZY去送快餐了,他们将自己居住的城市画了一张地图,已知在他们的地图上,有N个地方, ...

  9. 消息队列RabbitMQ使用教程收集

    学习应该要系统,最好的方式是看书. RabbitMQ最权威的教程应该参考官方文档. 下面是收集的一些教程: 官方: https://www.rabbitmq.com/getstarted.html h ...

  10. java实现floyd统计天津地铁的网站距离

    一:说明 (1)使用floyd实现各个网站的计算记录和路径 (2)网站获取和初始距离依据外部文件得到 (3)结果以外部文件的形式存储 (4)网站间转乘,觉得初始值也为1 (5)代码凝视比較具体,如有疑 ...