[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表)的更多相关文章

  1. BZOJ1047: [HAOI2007]理想的正方形 [单调队列]

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][St ...

  2. bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形

    http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...

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

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

  4. [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列

    理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...

  5. [Bzoj1047][HAOI2007]理想的正方形(ST表)

    题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 题目虽然有一个n的限制,但求二维区间最值首先想到的还是RMQ,但是如果按照往常RM ...

  6. BZOJ1047: [HAOI2007]理想的正方形

    传送门 蛤省省选果然水啊,我这种蒟蒻都能一遍A. 横向纵向维护两个单调队列,做两次求最大和最小的,总复杂度$O(NM)$ 码农题,考察代码实现能力 //BZOJ 1047 //by Cydiater ...

  7. [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)

    题意 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 思路 RMQ求 再DP 代码 #include<cstdio> #i ...

  8. 【单调队列】bzoj1047 [HAOI2007]理想的正方形

    先把整个矩阵处理成b[n][m-K+1].c[n][m-K+1]大小的两个矩阵,分别存储每行每K个数中的最大.最小值,然后再通过b.c处理出d.e分别表示K*K大小的子矩阵中的最大.最小值即可.单调队 ...

  9. [BZOJ1047][HAOI2007]理想的正方形 二维单调队列

    题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 我们对每矩阵的一列维护一个大小为$n$的单调队列,队中元素为矩阵中元素.然后扫描每一 ...

  10. bzoj1047 [HAOI2007]理想的正方形——二维单调队列

    题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 就是先对行做一遍单调队列,再对那个结果按列做一遍单调队列即可. 代码如下: #incl ...

随机推荐

  1. 一个简单的AXIS远程调用Web Service示例

    我们通常都将编写好的Web Service发布在Tomcat或者其他应用服务器上,然后通过浏览器调用该Web Service,返回规范的XML文件.但是如果我们不通过浏览器调用,而是通过客户端程序调用 ...

  2. OSCache-缓存过滤器CacheFilter

    用CashFilter实现页面级缓存. 在OSCache组件中提供了一个CacheFilter用于实现页面级的缓存,主要用于对web应用中的某些动态页面进行缓存,尤其是那些需要生成pdf格式文件/报表 ...

  3. Collision Detection

    [Collision Detection] Collision Detection是Rigidbody中的一个属性.所以显然Collision Detection指定的类型只在Rigidbody之间才 ...

  4. Spring总结七:AOP动态代理的实现

    Spring中的AOP代理可以使JDK动态代理,也可以是CGLIB代理,前者基于接口,后者基于子类. 首先我们来用代码简单演示jdk动态代理: 现在有一个商品的增删改查的操作 /** * 商品操作接口 ...

  5. Android 建立AIDL的步骤

    建立AIDL服务要比建立普通的服务复杂一些,具体步骤如下: (1)在Eclipse Android工程的Java包目录中建立一个扩展名为aidl的文件.该文件的语法类似于Java代码,但会稍有不同.详 ...

  6. 408. Valid Word Abbreviation有效的单词缩写

    [抄题]: Given a non-empty string s and an abbreviation abbr, return whether the string matches with th ...

  7. opennebule 创建cdrom数据发送

    {","csrftoken":"b9b5026f1a92180b789971ed8e21d28b"}

  8. SqlServer-truncate && delete && drop 的区别

    有些人在删除表的所有记录的时候,喜欢这样来——不给DELETE 语句提供WHERE 子句,表中的所有记录都将被删除.但这种方法是不可取的,正确的应该使用 TRUNCATE TABLE tb_name ...

  9. EXE DLL等可执行程序添加版本号版权等信息

    在使用Microsoft Visual Studio开发工具等编写的exe或者dll等可执行文件时,我们往往需要对这些可执行文件添加版本号,公司,版权等信息. 1. 在我们需要添加各种信息的项目工程中 ...

  10. 性能优化之_android多线程

    本文大纲为: 如何创建线程 线程间如何通讯 线程间如何安全的共享信息 一.线程的创建 Thread在run方法中执行具体事务,或者传入一个runnable对象,但是不能调用view控件的更新方法,但是 ...