【单调队列】bzoj1047 [HAOI2007]理想的正方形
先把整个矩阵处理成b[n][m-K+1]、c[n][m-K+1]大小的两个矩阵,分别存储每行每K个数中的最大、最小值,然后再通过b、c处理出d、e分别表示K*K大小的子矩阵中的最大、最小值即可。单调队列暴力。
#include<cstdio>
#include<algorithm>
using namespace std;
#define N 1001
int n,m,K,a[N][N],b[N][N],c[N][N],q[N],head,tail,d[N][N],e[N][N];
int ans=2147483647;
int main()
{
scanf("%d%d%d",&n,&m,&K);
for(int i=1;i<=n;++i)
for(int j=1;j<=m;++j)
scanf("%d",&a[i][j]);
for(int i=1;i<=n;++i)
{
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(a[i][j]<=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
}
b[i][1]=a[i][q[head]];
for(int j=K+1;j<=m;++j)
{
if(q[head]<j-K+1) ++head;
while(a[i][j]<=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
b[i][j-K+1]=a[i][q[head]];
}
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(a[i][j]>=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
}
c[i][1]=a[i][q[head]];
for(int j=K+1;j<=m;++j)
{
if(q[head]<j-K+1) ++head;
while(a[i][j]>=a[i][q[tail]] && tail>=head) --tail;
q[++tail]=j;
c[i][j-K+1]=a[i][q[head]];
}
}
for(int i=1;i<=m-K+1;++i)
{
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(b[j][i]<=b[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
}
d[1][i]=b[q[head]][i];
for(int j=K+1;j<=n;++j)
{
if(q[head]<j-K+1) ++head;
while(b[j][i]<=b[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
d[j-K+1][i]=b[q[head]][i];
}
head=tail=q[1]=1;
for(int j=2;j<=K;++j)
{
while(c[j][i]>=c[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
}
e[1][i]=c[q[head]][i];
for(int j=K+1;j<=n;++j)
{
if(q[head]<j-K+1) ++head;
while(c[j][i]>=c[q[tail]][i] && tail>=head) --tail;
q[++tail]=j;
e[j-K+1][i]=c[q[head]][i];
}
}
for(int i=1;i<=n-K+1;++i)
for(int j=1;j<=m-K+1;++j)
ans=min(ans,e[i][j]-d[i][j]);
printf("%d\n",ans);
return 0;
}
【单调队列】bzoj1047 [HAOI2007]理想的正方形的更多相关文章
- 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]理想的正方形_动态规划_单调队列
理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...
- [BZOJ1047][HAOI2007]理想的正方形 二维单调队列
题目链接:http://www.lydsy.com/JudgeOnline/problem.php?id=1047 我们对每矩阵的一列维护一个大小为$n$的单调队列,队中元素为矩阵中元素.然后扫描每一 ...
- bzoj1047 [HAOI2007]理想的正方形——二维单调队列
题目:https://www.lydsy.com/JudgeOnline/problem.php?id=1047 就是先对行做一遍单调队列,再对那个结果按列做一遍单调队列即可. 代码如下: #incl ...
- [题解](单调队列)luogu_P2216_BZOJ_1047 理想的正方形
调了半天,发现这个写法确实极易错...... 对于每列都维护一个单调队列记录最大最小值,这样一次操作后就把最大最小值压到了一维, 然后再对这一行维护一个单调队列,每次更新ans值,然而对于数组和队列下 ...
- BZOJ1047: [HAOI2007]理想的正方形
传送门 蛤省省选果然水啊,我这种蒟蒻都能一遍A. 横向纵向维护两个单调队列,做两次求最大和最小的,总复杂度$O(NM)$ 码农题,考察代码实现能力 //BZOJ 1047 //by Cydiater ...
- 【二维单调队列】BZOJ1047-[HAOI2007]理想的正方形
[题目大意] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [思路] 裸的二维单调队列.二维单调队列的思路其实很简单: (1)对于每 ...
- BZOJ1047[HAOI2007]理想的正方形——二维ST表
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...
随机推荐
- 怎么替换jar包里面的文件?
很多时候,我们需要替换包含在jar包里面的文件,例如修改里面的配置文件. 由于jar包已经生成,在不想重新用eclipse导出的情况下,我们怎么修改jar包里面的文件呢? 其实说出来很简单,可以使用以 ...
- 从零开始学习MXnet(五)MXnet的黑科技之显存节省大法
写完发现名字有点拗口..- -# 大家在做deep learning的时候,应该都遇到过显存不够用,然后不得不去痛苦的减去batchszie,或者砍自己的网络结构呢? 最后跑出来的效果不尽如人意,总觉 ...
- GROUP_CONCAT(expr)
This function returns a string result with the concatenated non-NULL values from a group. It returns ...
- CSS中的@ AT规则
大家可能在CSS中见到过字符@然后加一些关键字的用法,这种用法就称之为AT规则,在CSS中,种类还是很多的,这里总结列举下. 常规规则 所谓“常规规则”指的是语法类似下面的规则: @[KEYWORD] ...
- MySQL远程访问权限 允许远程连接
1 首先cd / 到根目录,打开mysql控制台 登录数据库 mysql -u root -p 2.授权远程连接 mysql> use mysql; Database changed mysq ...
- es6+最佳入门实践(13)
13.模块化 13.1.什么是模块化 模块化是一种处理复杂系统分解为更好的可管理模块的方式.通俗的讲就是把一个复杂的功能拆分成多个小功能,并且以一种良好的机制管理起来,这样就可以认为是模块化.就像作家 ...
- Bzoj1313 [HAOI2008]下落的圆盘
有 n 个圆盘从天而降,后面落下的可以盖住前面的.最后按掉下的顺序,在平面上依次测得每个圆盘的圆心和半径,问下落完成后从上往下看,整个图形的周长是多少,即你可以看到的圆盘的轮廓的圆盘的轮廓总长.例如下 ...
- bzoj 3208 暴力
对于每个操作,直接暴力做就行了,询问的话搜一遍,然后 就这么水过去了. /************************************************************** ...
- 如何保护自己的windows系统
最近一段时间给windows做加固防护,积累了几个小工具. 1.杀毒:火绒+火绒剑,windows10 自带的杀毒Windows Defender 2.日志记录: sysmon sysmon用来 ...
- 【MT8382/8121】为MTK的工厂测试添加测试项
摘要: 本文介绍添加MTK工厂测试项的步骤及调试技巧. 纲要: 1. 描述添加MTK工厂测试项的步骤 2.调试小技巧 1. 描述添加MTK工厂测试项的步骤 以添加红外测试为例: 1. mediatek ...