题目描述

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

输入输出格式

输入格式:

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

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

输出格式:

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

输入输出样例

输入样例#1:

5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2

输出样例#1:

1

说明

问题规模

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

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

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

二维RMQ优化。

分别记录下最大值和最小值,然后查询即可

 1 #include<iostream>
 2 #include<cstdio>
 3 #include<cstring>
 4 #include<cmath>
 5 #include<queue>
 6 #include<algorithm>
 7 #define lli long long int
 8 using namespace std;
 9 const int MAXN=1111;
10 void read(int &n)
11 {
12     char c='+';int x=0;bool flag=0;
13     while(c<'0'||c>'9')
14     {c=getchar();if(c=='-')flag=1;}
15     while(c>='0'&&c<='9')
16     {x=x*10+c-48;c=getchar();}
17     flag==1?n=-x:n=x;
18 }
19 int maxx[MAXN][MAXN];
20 int minx[MAXN][MAXN];
21 int n,m,kuan;
22 int a[MAXN][MAXN];
23 int logn=0;
24 int ans=1000000000;
25 int ask(int x,int y)
26 {
27     int mx=0,mi=0;
28     mx=max(maxx[x][y],maxx[x+kuan-(1<<logn)][y+kuan-(1<<logn)]);
29     mx=max(mx,maxx[x][y+kuan-(1<<logn)]);
30     mx=max(mx,maxx[x+kuan-(1<<logn)][y]);
31     mi=min(minx[x][y],minx[x+kuan-(1<<logn)][y+kuan-(1<<logn)]);
32     mi=min(mi,minx[x][y+kuan-(1<<logn)]);
33     mi=min(mi,minx[x+kuan-(1<<logn)][y]);
34     return mx-mi;
35 }
36 void pre()
37 {
38     for(int k=0;k<logn;k++)
39         for(int i=0;i+(1<<k)<n;i++)
40             for(int j=0;j+(1<<k)<m;j++)
41                 {
42                     maxx[i][j]=max(maxx[i][j],maxx[i+(1<<k)][j]);
43                     maxx[i][j]=max(maxx[i][j],max(maxx[i+(1<<k)][j+(1<<k)],maxx[i][j+(1<<k)]));
44                     minx[i][j]=min(minx[i][j],minx[i+(1<<k)][j]);
45                     minx[i][j]=min(minx[i][j],min(minx[i+(1<<k)][j+(1<<k)],minx[i][j+(1<<k)]));
46
47                 }
48 }
49 int main()
50 {
51
52     //cout<<ans;
53     read(n);read(m);read(kuan);
54     /*if(n==1000&&m==1000&&kuan==100)
55     {
56         cout<<998893495;
57         return 0;
58     }*/
59     for(int i=0;i<n;i++)
60         for(int j=0;j<m;j++)
61         {
62             read(a[i][j]);
63             maxx[i][j]=minx[i][j]=a[i][j];
64         }
65
66     while((1<<(logn+1))<=kuan)
67         logn++;
68     pre();
69     for(int i=0;i<=n-kuan;i++)
70         for(int j=0;j<=m-kuan;j++)
71             ans=min(ans,ask(i,j));
72     printf("%d",ans);
73     return 0;
74 }

转载于:https://www.cnblogs.com/zwfymqz/p/7142501.html

P2216 [HAOI2007]理想的正方形(二维RMQ)相关推荐

  1. P2216 [HAOI2007]理想的正方形 ( 二维ST表 )

    题目链接:点击进入 题目 思路 maxx [ i ] [ j ] :左上角坐标 ( i , j ) ,边长为 2 k 2^k 2k 的正方形的最大值 minn [ i ] [ j ] :左上角坐标 ( ...

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

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

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

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

  4. luogu P2216 [HAOI2007]理想的正方形 递推+ST表

    题意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 数据规模: (1)矩阵中的所有数都不超过1,000,000,000 (2)20% ...

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

    题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [题目分析] 单调队列优化DP [代码] #include <cstd ...

  6. 理想的正方形 HAOI2007(二维RMQ)

    理想的正方形 省队选拔赛河南  时间限制: 1 s  空间限制: 256000 KB  题目等级 : 大师 Master       题目描述 Description 有一个a*b的整数组成的矩阵,现 ...

  7. [HAOI2007] 理想的正方形

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

  8. bzoj 1047: [HAOI2007]理想的正方形

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MB Submit: 3324  Solved: 1828 [Submit][ ...

  9. 小程序生成二维码,正方形二维码,跟小程序码

    data:{ qrimg: " ", showCodeImg:true, } wx.request({ url: app.globalData.siteurlh5 +'/api/a ...

最新文章

  1. 【OO学习】OO第四单元作业总结及OO课程总结
  2. 27对象的向上向下转型
  3. C/Cpp / string 截取、替换、查找
  4. 关于exchange2003使用owa修改用户口令
  5. G6 图可视化引擎——快速上手
  6. (轉載) 大學就學貸款 可分12年還 (News)
  7. outlook vba开发要点
  8. 【李宏毅2020 ML/DL】P97-98 More about Meta Learning
  9. 在中國古代是沒有這種現象的
  10. LINUX SHELL脚本如何判断一个目录下有没有文件
  11. 关于计算机编程语言 国外网友妙语录
  12. paip.c++ gcc 不能捕获exception异常的解决
  13. html css调用自定义字体,html css使用特殊自定义字体避免侵权
  14. android 查看系统字体大小,Android 如何获取系统字体大小
  15. gitee的下载安装以及简单使用
  16. python seo 相关的库_11个并不被常用但对开发非常有帮助的Python库
  17. 放假在家/异地/无法使用学校局域网-如何快速登录知网/web of science等学术平台
  18. Excel按倍率一键调整当前表格的行高
  19. 乐变热更新SDK的集成
  20. 类名.class 类名.this 详解

热门文章

  1. python默认字体大小_python – 如何设置PIL加载的默认字体的大小,使其适合我的8×8矩阵?...
  2. c mysql 地址池_FreeRadius 根据mysql 下发指定地址池的地址...
  3. C++ 11 深度学习(八)重定义override
  4. 【UDP协议头解析】
  5. ideal pom文件安装到maven库中_java学习之web基础(14)Maven基础学习
  6. 30 校准_校准or质控,傻傻分不清楚
  7. 二叉树层次遍历c语言_[LeetCode] 107. 二叉树的层次遍历 II
  8. sping jdbc 链接mysql_Spring Boot JDBC 连接数据库示例
  9. 光纤以太网交换机产品性能介绍
  10. 【渝粤教育】国家开放大学2018年秋季 0717-21T社会保障基础 参考试题