真·水题。小C本来是不想贴出来的,但是有一股来自东方的神秘力量催促小C发出来。

Description

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

Input

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

Output

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

Sample Input

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

Sample Output

  1

HINT

  2<=a,b<=1000,n<=a,n<=b,n<=1000

Solution

  如果你是按照BZOJ第一页AC人数做下来的话,你的思路会被前一题稍微套路一下。

  回归正题,拿到这题我们正常的思路就是枚举所有矩阵,计算最大最小值更新答案。

  暴力O(n^4),二维线段树O(n^2logn)……发现可以降维(先做第一维,再做第二维)……发现询问区间长度固定……

  单调队列啊……

  每一行都维护两个单调队列(最大最小值),a行同时进行维护。

  维护到所有可能的右端点时,把维护的这a个最大/小值拿出来,在列上做一遍单调队列,顺便更新答案。

  时间复杂度O(n^2)。

  题解写得比较意识流,但小C认为如果你没懂不是小C的错。

#include <cstdio>
#include <algorithm>
#include <cstring>
#define MN 1005
#define INF 0x3FFFFFFF
using namespace std;
struct que
{
int hd,tl,q1[MN],q2[MN];
void clear() {hd=; tl=;}
int top() {return q2[hd];}
void push(int x,int y,int g)
{
for (;hd<=tl&&((y>q2[tl])^g);--tl);
++tl; q1[tl]=x; q2[tl]=y;
}
void pop(int x) {for (;hd<=tl&&q1[hd]<=x;++hd);}
}sdu[MN],sdd[MN],su,sd;
int a[MN][MN];
int n,m,p,ans; inline int read()
{
int n=,f=; char c=getchar();
while (c<'' || c>'') {if(c=='-')f=-; c=getchar();}
while (c>='' && c<='') {n=n*+c-''; c=getchar();}
return n*f;
} int main()
{
register int i,j;
n=read(); m=read(); p=read(); ans=INF;
for (i=;i<=n;++i)
for (j=;j<=m;++j) a[i][j]=read();
for (i=;i<=n;++i) sdu[i].clear(),sdd[i].clear();
for (i=;i<=n;++i)
for (j=;j<p;++j) sdu[i].push(j,a[i][j],),sdd[i].push(j,a[i][j],);
for (i=p;i<=m;++i)
{
su.clear(); sd.clear();
for (j=;j<=n;++j)
{
sdu[j].push(i,a[j][i],); sdu[j].pop(i-p);
sdd[j].push(i,a[j][i],); sdd[j].pop(i-p);
su.push(j,sdu[j].top(),); su.pop(j-p);
sd.push(j,sdd[j].top(),); sd.pop(j-p);
if (j>=p) ans=min(ans,su.top()-sd.top());
}
}
printf("%d",ans);
}

Last Word

  小C才不会告诉你把这题贴出来的原因是小C觉得自己的代码好看。

[BZOJ]1047 理想的正方形(HAOI2007)的更多相关文章

  1. [HAOI2007][BZOJ 1047]理想的正方形

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

  2. BZOJ 1047 理想的正方形(单调队列)

    题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047 题意:给出一个n*m的矩阵.在所有K*K的子矩阵中,最大最小差值最小的是多少? 思 ...

  3. BZOJ 1047 理想的正方形

    单调队列的基本应用. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

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

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

  5. bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp

    题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2369  Solved: 1266[Submi ...

  6. BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )

    单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是 ...

  7. [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】

    题目链接:BZOJ - 1047 题目分析 使用单调队列在 O(n^2) 的时间内求出每个 n * n 正方形的最大值,最小值.然后就可以直接统计答案了. 横向有 a 个单调队列(代码中是 Q[1] ...

  8. 【BZOJ】【1047】【HAOI2007】理想的正方形

    DP/单调队列优化 一眼看上去就是DP 我想的naive的二维DP是酱紫滴: mx[i][j][k]表示以(i,j)为右下角的k*k的正方形区域内的最大值,mn[i][j][k]同理 mx[i][j] ...

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

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

随机推荐

  1. http post/get 2种使用方式

     public class HttpUtil { //HttpPost public static String executePost(String url, List<NameValue ...

  2. Java ftp 上传文件和下载文件

    今天同事问我一个ftp 上传文件和下载文件功能应该怎么做,当时有点懵逼,毕竟我也是第一次,然后装了个逼,在网上找了一段代码发给同事,叫他调试一下.结果悲剧了,运行不通过.(装逼失败) 我找的文章链接: ...

  3. 2017 国庆湖南 Day6

    期望得分:100+100+60=260 实际得分:100+85+0=185 二分最后一条相交线段的位置 #include<cstdio> #include<iostream> ...

  4. Java中RuntimeException和Exception的区别

    [TOC] 1. 引入RuntimeException public class RuntimeException { public static void main(String[] args) { ...

  5. SpringMVC之HandlerMapping的使用

    上篇博客在了解SpringMVC的工作流程时留了一些疑问,今天先学习下HandlerMapping,在HandlerMapping中可以通过HandlerExecutionChain getHandl ...

  6. nyoj 还是回文

    还是回文 时间限制:2000 ms | 内存限制:65535 KB 难度:3 描述 判断回文串很简单,把字符串变成回文串也不难.现在我们增加点难度,给出一串字符(全部是小写字母),添加或删除一个字符, ...

  7. java之多态详解

    前言 什么叫多态?多态就是一种事物可以有多种表现形式 多态三要素 1.被动方必须有继承关系 2.子类一般都要重写父类方法 3.必须将主动方的功能函数的参数设置为 被动方父类的类型 举个例子司机开车 假 ...

  8. SpringCloud的Hystrix(一) 一个消费者内的两个服务监控

    一.概念与定义 1.服务雪崩 在微服务架构中,整个系统按业务拆分出一个个服务,这些服务之间可以相互调用(RPC),为了保证服务的高可用,单个服务通常会集群部署. 但是由于网络原因或自身原因,服务并不能 ...

  9. spring-oauth-server实践:使用授权方式四:client_credentials 模式的客户端和服务端交互

    spring-oauth-server入门(1-11)使用授权方式四:client_credentials 模式的客戶端 一.客户端逻辑 1.界面入口(credentials_access_token ...

  10. python网络爬虫与信息提取 学习笔记day3

    Day3: 只需两行代码解析html或xml信息    具体代码实现:day3_1    注意BeautifulSoup的B和S需要大写,因为python大小写敏感 import requests r ...