真·水题。小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. C# 封装miniblink 使用HTML/CSS/JS来构建.Net 应用程序界面和简易浏览器

    MiniBlink的作者是 龙泉寺扫地僧 miniblink是什么?   (抄了一下 龙泉寺扫地僧 写的简洁) Miniblink是一个全新的.追求极致小巧的浏览器内核项目,其基于chromium最新 ...

  2. python 判断变量是否是 None 的三种写法

    代码中经常会有变量是否为None的判断,有三种主要的写法:第一种是`if x is None`:第二种是 `if not x:`:第三种是`if not x is None`(这句这样理解更清晰`if ...

  3. python中 return 的用法

    return 语句就是讲结果返回到调用的地方,并把程序的控制权一起返回 程序运行到所遇到的第一个return即返回(退出def块),不会再运行第二个return. 要返回两个数值,写成一行即可: de ...

  4. 搭建ssm框架,可实现登录和数据展示以及增删改查

    需求: 后台使用ssm(spring-springMVC-mybatis)进行整合 前台使用bootstrap框架 前后台交互使用Ajax进行发送 表结构: 登录页面后显示所有用户信息,可对每条进行增 ...

  5. python全栈开发-hashlib模块(数据加密)、suprocess模块、xml模块

    一.hashlib模块 1.什么叫hash:hash是一种算法(3.x里代替了md5模块和sha模块,主要提供 SHA1, SHA224, SHA256, SHA384, SHA512 ,MD5 算法 ...

  6. SSM中的登陆验证码

    @Autowired private Producer captchaProducer = null; /** * 后台登录验证码 * @param request * @param response ...

  7. jQuery ajax方法success()中后台传来的四种数据类型

    1.后台返回一个页面 js代码 /**(1)用$("#content-wrapper").html(data);显示页面*/ $.ajax({ async : false, cac ...

  8. cache和buffer

    一.free命令是Linux查看内存使用情况的命令 1. centos 7风格 [root@bogon init.d]# free -m total used free shared buff/cac ...

  9. requests.post发送字典套字典

    import requests import json a = { "data": { "project": { "url": " ...

  10. find文件查找

    一.locate locate基于数据库索引来查找文件,数据库在开机时一段时间对更新,不会实时更新,数据库存放在(/var/lib/mlocate/mlocate.db),可以用updatedb来手动 ...