【BZOJ1047】[HAOI2007]理想的正方形 (倍增ST表)
[HAOI2007]理想的正方形
题目描述
有一个\(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\)
题解
刚学的二维\(ST\)表,和一维的大同小异。
\(mx[k][i][j]\)表示以\((i,j)\)作为左上角,边长为\(2^k\)的正方形内的最大值。
转移:
$mx[k][i][j]=max(max(mx[k-1][i][j],mx[k-1][i][j+(1<<(k-1))]),max(mx[k-1][i+(1<<(k-1))][j],mx[k-1][i+(1<<(k-1))][j+(1<<(k-1))])); $
最小值也是一样。
最后\(N^2\)枚举左上角端点统计答案。
code:
#include<iostream>
#include<algorithm>
#include<cstdio>
#include<cstring>
#include<cctype>
#include<cmath>
#define ll long long
#define R register
#define N 1005
using namespace std;
template<typename T>inline void read(T &a){
char c=getchar();T x=0,f=1;
while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}
while(isdigit(c)){x=(x<<1)+(x<<3)+c-'0';c=getchar();}
a=f*x;
}
int a,b,n,x,maxans,minans,ans=0x7fffffffLL,mx[11][N][N],mi[11][N][N];
int main(){
read(a);read(b);read(n);
for(R int i=1;i<=a;i++)
for(R int j=1;j<=b;j++)
read(x),mi[0][i][j]=mx[0][i][j]=x;
for(R int k=1;(1<<k)<=n;k++)
for(R int i=1;i<=a-(1<<k)+1;i++)
for(R int j=1;j<=b-(1<<k)+1;j++)
mi[k][i][j]=min(min(mi[k-1][i][j],mi[k-1][i][j+(1<<(k-1))]),min(mi[k-1][i+(1<<(k-1))][j],mi[k-1][i+(1<<(k-1))][j+(1<<(k-1))])),
mx[k][i][j]=max(max(mx[k-1][i][j],mx[k-1][i][j+(1<<(k-1))]),max(mx[k-1][i+(1<<(k-1))][j],mx[k-1][i+(1<<(k-1))][j+(1<<(k-1))]));
R int k=(int)log2(n);
for(R int i=1;i<=a-n+1;i++){
for(R int j=1;j<=b-n+1;j++){
minans=0x7fffffff;maxans=-0x7fffffff;
maxans=max(max(mx[k][i][j],mx[k][i][j+n-(1<<k)]),max(mx[k][i+n-(1<<k)][j],mx[k][i+n-(1<<k)][j+n-(1<<k)]));
minans=min(min(mi[k][i][j],mi[k][i][j+n-(1<<k)]),min(mi[k][i+n-(1<<k)][j],mi[k][i+n-(1<<k)][j+n-(1<<k)]));
ans=min(maxans-minans,ans);
}
}
printf("%d\n",ans);
return 0;
}
【BZOJ1047】[HAOI2007]理想的正方形 (倍增ST表)的更多相关文章
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...
- BZOJ1047[HAOI2007]理想的正方形——二维ST表
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...
- [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列
理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...
- [Bzoj1047][HAOI2007]理想的正方形(ST表)
题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 题目虽然有一个n的限制,但求二维区间最值首先想到的还是RMQ,但是如果按照往常RM ...
- BZOJ1047: [HAOI2007]理想的正方形
传送门 蛤省省选果然水啊,我这种蒟蒻都能一遍A. 横向纵向维护两个单调队列,做两次求最大和最小的,总复杂度$O(NM)$ 码农题,考察代码实现能力 //BZOJ 1047 //by Cydiater ...
- [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)
题意 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 思路 RMQ求 再DP 代码 #include<cstdio> #i ...
- 【单调队列】bzoj1047 [HAOI2007]理想的正方形
先把整个矩阵处理成b[n][m-K+1].c[n][m-K+1]大小的两个矩阵,分别存储每行每K个数中的最大.最小值,然后再通过b.c处理出d.e分别表示K*K大小的子矩阵中的最大.最小值即可.单调队 ...
- [BZOJ1047][HAOI2007]理想的正方形 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 我们对每矩阵的一列维护一个大小为$n$的单调队列,队中元素为矩阵中元素.然后扫描每一 ...
- bzoj1047 [HAOI2007]理想的正方形——二维单调队列
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 就是先对行做一遍单调队列,再对那个结果按列做一遍单调队列即可. 代码如下: #incl ...
随机推荐
- nat123软件windows版
转自:http://www.nat123.com/pages_8_565.jsp 同时支持内网和公网IP.只要可以上网,即可将所有应用发布外网. >>nat123客户端windows版本软 ...
- Delphi.NET
Delphi.NET Borland.VclDSnap.dll Borland.Vcl.TCustomClientDataSet TFieldType.ftBCD Borland.Vcl.TField ...
- Scala介绍
强大的编程语言 Scala 是一门非常强大的语言,它允许用户使用命令和函数范式进行编写代码,因此,编程时你可以使用常用的命令式语句,就像我们使用 C.Java.PHP 以及很多其他语言一样,而且,你也 ...
- 对输入字符进行HTML转义 OR 去HTML标签
/** * 对输入字符进行HTML转义 * @param mixed $data */ public static function escape($data) { if(is_array($data ...
- 反射01 Class类的使用、动态加载类、类类型说明、获取类的信息
0 Java反射机制 反射(Reflection)是 Java 的高级特性之一,是框架实现的基础. 0.1 定义 Java 反射机制是在运行状态中,对于任意一个类,都能够知道这个类的所有属性和方法:对 ...
- Stream01 定义、迭代、操作、惰性求值、创建流、并行流、收集器、stream运行机制
1 Stream Stream 是 Java 8 提供的一系列对可迭代元素处理的优化方案,使用 Stream 可以大大减少代码量,提高代码的可读性并且使代码更易并行. 2 迭代 2.1 需求 随机创建 ...
- 2-python代码坑点
#切片: # L = ['aaa', 'bbb', 'ccc', 'ddd'] # print(L[1 : 3]) #取[1, 3):下标 # L = list(range(100)) # print ...
- 卡2-SLAM
---恢复内容开始--- 1.下载 首先需要从github上Git以下两个包: git clonehttps://github.com/ros-perception/open_karto(开源的kar ...
- 第九课,ROS仿真1
---恢复内容开始--- 1.stage simulator 它是一个轻量级的仿真软件,它的包名称是stage_ros,可以进入看看,其包含地图在子目录world下, 启动之: rosrun stag ...
- bash/shell的字符串trim实现
#!/bin/sh trim() { trimmed=$1 trimmed=${trimmed%% } trimmed=${trimmed## } echo $trim ...