题目链接

做出二维\(ST\)表,然后\(O(n^2)\)扫一遍就好了。

  1. #include <cstdio>
  2. #include <cstring>
  3. #include <algorithm>
  4. using namespace std;
  5. const int MAXN = 1010;
  6. const int MAXLOGN = 12;
  7. int Max[MAXN][MAXN][MAXLOGN], Min[MAXN][MAXN][MAXLOGN], Log[MAXN];
  8. int n, m, k, ans = 2147483647;
  9. inline int read(){
  10. int s = 0, w = 1;
  11. char ch = getchar();
  12. while(ch < '0' || ch > '9'){ if(ch == '-') w = -1; ch = getchar(); }
  13. while(ch >= '0' && ch <= '9'){ s = s * 10 + ch - '0'; ch = getchar(); }
  14. return s * w;
  15. }
  16. int QueryMin(int x, int y){
  17. int p = Log[k];
  18. return min(min(Min[x][y][p], Min[x][y + k - (1 << p)][p]),
  19. min(Min[x + k - (1 << p)][y][p], Min[x + k - (1 << p)][y + k - (1 << p)][p]));
  20. }
  21. int QueryMax(int x, int y){
  22. int p = Log[k];
  23. return max(max(Max[x][y][p], Max[x][y + k - (1 << p)][p]),
  24. max(Max[x + k - (1 << p)][y][p], Max[x + k - (1 << p)][y + k - (1 << p)][p]));
  25. }
  26. int main(){
  27. Log[0] = -1;
  28. for(int i = 1; i <= 1000; ++i)
  29. Log[i] = Log[i >> 1] + 1;
  30. memset(Max, 128, sizeof Max);
  31. memset(Min, 127, sizeof Min);
  32. n = read(); m = read(); k = read();
  33. for(int i = 1; i <= n; ++i)
  34. for(int j = 1; j <= m; ++j)
  35. Max[i][j][0] = Min[i][j][0] = read();
  36. for(int l = 1; l <= 10; ++l)
  37. for(int i = 1; i <= n; ++i)
  38. for(int j = 1; j <= m; ++j){
  39. Max[i][j][l] = max(max(Max[i][j][l - 1], Max[i][min(j + (1 << (l - 1)), m)][l - 1]),
  40. max(Max[min(i + (1 << (l - 1)), n)][j][l - 1], Max[min(i + (1 << (l - 1)), n)][min(j + (1 << (l - 1)), m)][l - 1]));
  41. Min[i][j][l] = min(min(Min[i][j][l - 1], Min[i][min(j + (1 << (l - 1)), m)][l - 1]),
  42. min(Min[min(i + (1 << (l - 1)), n)][j][l - 1], Min[min(i + (1 << (l - 1)), n)][min(j + (1 << (l - 1)), m)][l - 1]));
  43. }
  44. for(int i = 1; i + k - 1 <= n; ++i)
  45. for(int j = 1; j + k - 1 <= m; ++j)
  46. ans = min(ans, QueryMax(i, j) - QueryMin(i, j));
  47. printf("%d\n", ans);
  48. return 0;
  49. }

【洛谷 P2216】 [HAOI2007]理想的正方形(二维ST表)的更多相关文章

  1. 洛谷 P2216 [HAOI2007]理想的正方形 || 二维RMQ的单调队列

    题目 这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值.最小和最大值的求法类似. 单调队列做法: 以最小值为例: q1[i][j]表示第i行上,从j列开始的n列的最小值.$q1 ...

  2. BZOJ1047[HAOI2007]理想的正方形——二维ST表

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

  3. 洛谷 P2216 [HAOI2007]理想的正方形

    P2216 [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一 ...

  4. [洛谷P2216][HAOI2007]理想的正方形

    题目大意:有一个$a\times b$的矩阵,求一个$n\times n$的矩阵,使该区域中的极差最小. 题解:二维$ST$表,每一个点试一下是不是左上角就行了 卡点:1.用了一份考试时候写的二维$S ...

  5. 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP

    洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...

  6. 【DP】【单调队列】洛谷 P2216 [HAOI2007]理想的正方形 题解

        算是单调队列的复习吧,不是很难 题目描述 有一个$a\times b$的整数组成的矩阵,现请你从中找出一个$n\times n$的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 ...

  7. 洛谷P2216 HAOI2007 理想的正方形 (单调队列)

    题目就是要求在n*m的矩形中找出一个k*k的正方形(理想正方形),使得这个正方形内最值之差最小(就是要维护最大值和最小值),显然我们可以用单调队列维护. 但是二维平面上单调队列怎么用? 我们先对行处理 ...

  8. 【BZOJ1047】[HAOI2007]理想的正方形 (倍增ST表)

    [HAOI2007]理想的正方形 题目描述 有一个\(a*b\)的整数组成的矩阵,现请你从中找出一个\(n*n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: ...

  9. [HNOI2007] 理想正方形 二维ST表

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

  10. 洛谷 P2216 [HAOI2007]理想正方形

    洛谷 巨说这是一道单调队列好题,但是我并不是用单调队列做的诶. 如果往最暴力的方向去想,肯定是\(n^3\)的\(dp\)了. \(f[i][j][k]\)代表当前正方形的左上角定点是\((i,j)\ ...

随机推荐

  1. 主从复制redis

    编辑主服务器的配置文件 注释下面一项 # slaveof  192.168.10.1  6379 主从复制 一主可以有多从,支持链式连级 一主多从 1:修改从服务器的配置文件/etc/redis.co ...

  2. Qt容器类汇总说明

    版权声明:若无来源注明,Techie亮博客文章均为原创. 转载请以链接形式标明本文标题和地址: 本文标题:Qt容器类汇总说明     本文地址:http://techieliang.com/2017/ ...

  3. PHP 生成条形码

    <?php class BarCode128 { const STARTA = 103; const STARTB = 104; const STARTC = 105; const STOP = ...

  4. 第131天:移动web页面的排版与布局

    一.总之一句话, 尽量用mm 毫米作为标准单位. 采用新的相对单位 rem 首先设置html的 font-size 为根大小. html{ font-size:1mm; } .titleheight{ ...

  5. BZOJ 2007 海拔(平面图最小割转对偶图最短路)

    首先注意到,把一个点的海拔定为>1的数是毫无意义的.实际上,可以转化为把这些点的海拔要么定为0,要么定为1. 其次,如果一个点周围的点的海拔没有和它相同的,那么这个点的海拔也是可以优化的,即把这 ...

  6. 【数据库_Mysql】MySQL—修改表时给表添加联合主键约束

      添加语法如下: “ALTER TABLE table_name ADD CONSTRAINT pk_table_name PRIMARY KEY(列名1,列名2):” [示例1]假设订房信息表(O ...

  7. 编写高效SQL语句(转)

    转至http://blog.csdn.net/u012150457/article/details/41846299 一.编写高效SQL语句 1) 选择最有效的表名顺序(仅适用于RBO模式) ORAC ...

  8. [二十一]SpringBoot 之 导入xml配置

    SpringBoot理念就是零配置编程,但是如果绝对需要使用XML的配置,我们建议您仍旧从一个@Configuration类开始,你可以使用@ImportResouce注解加载XML配置文件,我拿一个 ...

  9. JAVA中的堆、栈等内存分析

    在 JAVA 中,有六个不同的地方可以存储数据 1. 寄存器( register ) 这是最快的存储区,因为它位于不同于其他存储区的地方——处理器内部.但是寄存器的数量极其有限,所以寄存器由编译器根据 ...

  10. 【CodeChef PREFIXOR】Prefix XOR

    https://odzkskevi.qnssl.com/f0fbdb108ec813b1294f8f714805963b?v=1502083692 网上搜到的题解: http://blog.csdn. ...