P2216 [HAOI2007]理想的正方形(二维RMQ)
题目描述
有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
输入输出格式
输入格式:
第一行为3个整数,分别表示a,b,n的值
第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。
输出格式:
仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。
输入输出样例
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,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优化。
分别记录下最大值和最小值,然后查询即可
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<queue>
#include<algorithm>
#define lli long long int
using namespace std;
const int MAXN=;
void read(int &n)
{
char c='+';int x=;bool flag=;
while(c<''||c>'')
{c=getchar();if(c=='-')flag=;}
while(c>=''&&c<='')
{x=x*+c-;c=getchar();}
flag==?n=-x:n=x;
}
int maxx[MAXN][MAXN];
int minx[MAXN][MAXN];
int n,m,kuan;
int a[MAXN][MAXN];
int logn=;
int ans=;
int ask(int x,int y)
{
int mx=,mi=;
mx=max(maxx[x][y],maxx[x+kuan-(<<logn)][y+kuan-(<<logn)]);
mx=max(mx,maxx[x][y+kuan-(<<logn)]);
mx=max(mx,maxx[x+kuan-(<<logn)][y]);
mi=min(minx[x][y],minx[x+kuan-(<<logn)][y+kuan-(<<logn)]);
mi=min(mi,minx[x][y+kuan-(<<logn)]);
mi=min(mi,minx[x+kuan-(<<logn)][y]);
return mx-mi;
}
void pre()
{
for(int k=;k<logn;k++)
for(int i=;i+(<<k)<n;i++)
for(int j=;j+(<<k)<m;j++)
{
maxx[i][j]=max(maxx[i][j],maxx[i+(<<k)][j]);
maxx[i][j]=max(maxx[i][j],max(maxx[i+(<<k)][j+(<<k)],maxx[i][j+(<<k)]));
minx[i][j]=min(minx[i][j],minx[i+(<<k)][j]);
minx[i][j]=min(minx[i][j],min(minx[i+(<<k)][j+(<<k)],minx[i][j+(<<k)])); }
}
int main()
{ //cout<<ans;
read(n);read(m);read(kuan);
/*if(n==1000&&m==1000&&kuan==100)
{
cout<<998893495;
return 0;
}*/
for(int i=;i<n;i++)
for(int j=;j<m;j++)
{
read(a[i][j]);
maxx[i][j]=minx[i][j]=a[i][j];
} while((<<(logn+))<=kuan)
logn++;
pre();
for(int i=;i<=n-kuan;i++)
for(int j=;j<=m-kuan;j++)
ans=min(ans,ask(i,j));
printf("%d",ans);
return ;
}
P2216 [HAOI2007]理想的正方形(二维RMQ)的更多相关文章
- 洛谷 P2216 [HAOI2007]理想的正方形 || 二维RMQ的单调队列
题目 这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值.最小和最大值的求法类似. 单调队列做法: 以最小值为例: q1[i][j]表示第i行上,从j列开始的n列的最小值.$q1 ...
- 【bzoj1047】[HAOI2007]理想的正方形 二维RMQ
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...
- BZOJ1047[HAOI2007]理想的正方形——二维ST表
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...
- [BZOJ1047][HAOI2007]理想的正方形 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 我们对每矩阵的一列维护一个大小为$n$的单调队列,队中元素为矩阵中元素.然后扫描每一 ...
- bzoj1047 [HAOI2007]理想的正方形——二维单调队列
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 就是先对行做一遍单调队列,再对那个结果按列做一遍单调队列即可. 代码如下: #incl ...
- P2216 [HAOI2007]理想的正方形 (单调队列)
题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...
- 洛谷 P2216 [HAOI2007]理想的正方形
P2216 [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一 ...
- P2216 [HAOI2007]理想的正方形 方法记录
[HAOI2007]理想的正方形 题目描述 有一个 \(a \times b\) 的整数组成的矩阵,现请你从中找出一个 \(n \times n\) 的正方形区域,使得该区域所有数中的最大值和最小值的 ...
- P2216 [HAOI2007]理想的正方形
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...
随机推荐
- 初步学习Axure---整理了一下自己两周的学习成果:动态面板
自己无意间发现了做原型设计的工具--Axure,所以就自学了一点皮毛.最近时间比较充裕,就把自己现学现卖的东西整一整. 作品比较简单,没有技术可言,根据用户和开发需求,利用动态面板和一些点击事件完成了 ...
- CSS text-transform 属性 控制控制文本的大小写
值 描述 none 默认.定义带有小写字母和大写字母的标准的文本. capitalize 文本中的每个单词以大写字母开头. uppercase 定义仅有大写字母. lowercase 定义无大写字母, ...
- day27-1 numpy模块
目录 numpy array 一维数组 二维数组(用的最多) np.array和list的区别 获取多维数组的行和列 多维数组的索引 高级功能 多维数组的元素替换 多维数组的合并 通过函数方法创建多维 ...
- 洛谷P1563 玩具谜题 简单模拟
没意义,注意方向别判错. Code: #include<cstdio> #include<cstring> using namespace std; const int max ...
- [using_microsoft_infopath_2010]Chapter10 与SharePoint Designer工作流集成
本章概要: 1.创建工作流集成表单 2.允许工作流手动触发 3.创建自定义动作按钮 4.使用人物设计器 5.维护工作流人物表单
- Leetcode_299_Bulls and Cows
本文是在学习中的总结,欢迎转载但请注明出处:http://blog.csdn.net/pistolove/article/details/50768550 You are playing the fo ...
- [ES6] Proxy & Reflect
Proxy and Reflect API works nicely together. About how to use Proxy, check this post. Let's see abou ...
- gitlab一键安装 笔记
0 简单介绍bitnami和gitlab bitnami BitNami是一个开源项目,该项目产生的开源软件包安装 Web应用程序和解决方式堆栈.以及虚拟设备. bitnami主办Bitrock公司成 ...
- VC版超级记事本
这是学习VC时的一个大作业,超级记事本.突然发现了,传上来供大家学习參考! 一. 功能需求: 1. 能在原有像记事本程序的基础上加入很多其它功能: 1).可以改变背景颜色. 2).可以改变字体颜色. ...
- UVA10370 Above Average
Above Average It is said that 90% of frosh expect to be above average in their class. You are to pro ...