[BZOJ]1047 理想的正方形(HAOI2007)
真·水题。小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)的更多相关文章
- [HAOI2007][BZOJ 1047]理想的正方形
Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. Input 第一行为3个整数,分别表示a,b,n的值第二行至第 ...
- BZOJ 1047 理想的正方形(单调队列)
题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047 题意:给出一个n*m的矩阵.在所有K*K的子矩阵中,最大最小差值最小的是多少? 思 ...
- BZOJ 1047 理想的正方形
单调队列的基本应用. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...
- 理想的正方形 HAOI2007(二维RMQ)
理想的正方形 省队选拔赛河南 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 有一个a*b的整数组成的矩阵,现 ...
- bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp
题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2369 Solved: 1266[Submi ...
- BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )
单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是 ...
- [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】
题目链接:BZOJ - 1047 题目分析 使用单调队列在 O(n^2) 的时间内求出每个 n * n 正方形的最大值,最小值.然后就可以直接统计答案了. 横向有 a 个单调队列(代码中是 Q[1] ...
- 【BZOJ】【1047】【HAOI2007】理想的正方形
DP/单调队列优化 一眼看上去就是DP 我想的naive的二维DP是酱紫滴: mx[i][j][k]表示以(i,j)为右下角的k*k的正方形区域内的最大值,mn[i][j][k]同理 mx[i][j] ...
- bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...
随机推荐
- python构造一个freebuf新闻发送脚本
前言: 放假学习完web漏洞后.想写一个脚本 然而自己菜无法像大佬们一样写出牛逼的东西 尝试写了,都以失败告终. 还有一个原因:上学时间不能及时看到,自己也比较懒.邮件能提醒自己. 需要安装的模块: ...
- Connect Appium Server Fail.A new session could not be created
1.由于安卓测试机性能低下,并不能支持测试工作,想安装一个模拟器帮助测试,然后发现群里有朋友发了一个夜神模拟器..下载..安装..美滋滋的准备运行脚本.What..居然报错了..orz..然后百度查找 ...
- 聊一聊C#的Equals()和GetHashCode()方法
博客创建一年多,还是第一次写博文,有什么不对的地方还请多多指教. 关于这次写的内容可以说是老生长谈,百度一搜一大堆.大神可自行绕路. 最近在看Jeffrey Richter的CLR Via C#,在看 ...
- vSphere Client 搭建Windows server 2008 r2 服务器指南
下载准备 下载并安装vSphere Client 链接:https://pan.baidu.com/s/1v0IrGrMjpA2FGeqagaJN-g 密码:zzd1 下载Windows server ...
- ASP.NET Web API编程——模型验证与绑定
1.模型验证 使用特性约束模型属性 可以使用System.ComponentModel.DataAnnotations提供的特性来限制模型. 例如,Required特性表示字段值不能为空,Range特 ...
- 你考虑清楚了吗就决定用 Bootstrap ?
近年来,在前端项目中, Bootstrap 已经成为了一个非常受欢迎的工具. Bootstrap 的确有很多优点,然而,如果你的团队中恰好有一个专职的前端工程师.那我推荐你们不要使用 Bootstra ...
- guava-19.0和google-collections-1.0 的 ImmutableSet 类冲突
guava-19.0 google-collections-1.0 都有 ImmutableSet 类,包路径也一致,前者有 copyOf(Collection)? 一.应用报错: 二.解决办法 co ...
- 整理一下 System.Linq.Enumerable 类中的那些比较少用的方法
Linq 虽然用得多,但是里面有一些方法比较少用,因此整理一下.Enumerable 类的所有方法可以在 MSDN 上查阅到:https://msdn.microsoft.com/zh-cn/libr ...
- 翻译:JVM虚拟机规范1.7中的运行时常量池部分(三)
4.4.7. The CONSTANT_Utf8_info Structure The CONSTANT_Utf8_info structure is used to represent consta ...
- The python debugger(PDB)的简介
转自:http://www.cnblogs.com/wei-li/archive/2012/05/02/2479082.html 学习Python调试,最好的资料当然是官方文档和(pdb)help了, ...