【单调队列】bzoj 1407 [HAOI2007]理想的正方形
【题意】
- 给定一个n*m的矩阵,求所有大小为k*k的正方形中(最大值-最小值)的最小值
【思路】
- 先横着算出每一行的长度为k的窗口内的最大值,变成一个n*(m-k+1)的矩阵mx
- 再竖着算出每一列的长度为k的窗口内的最大值,变成一个(n-k+1)*(m-k+1)的矩阵t1(在mx的基础上算)
- 问题到这里转化为裸的单调队列
- 最小值同理
- 时间复杂度为O(n*m)
- 转自http://www.cnblogs.com/szy-wlxy/p/4631700.html

【AC】
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
inline int read()
{
int x=,f=;char ch=getchar();
while(ch<''||ch>''){if(ch=='-')f=-;ch=getchar();}
while(ch>=''&&ch<=''){x=x*+ch-'';ch=getchar();}
return x*f;
} int n,m,k;
const int maxn=1e3+;
int a[maxn][maxn];
int mx[maxn][maxn];
int mn[maxn][maxn];
int t1[maxn][maxn];
int t2[maxn][maxn];
struct node
{
int x;
int pos;
node(){}
node(int _x,int _pos):x(_x),pos(_pos){}
}q[maxn];
void pre()
{
for(int i=;i<=n;i++)
{
//max
int head=,tail=;
for(int j=;j<=m;j++)
{
while(tail>=head&&q[tail].x<=a[i][j])
tail--;
q[++tail].x=a[i][j],q[tail].pos=j;
while(q[head].pos<=j-k)
head++;
if(j>=k)
mx[i][j]=q[head].x;
}
//min
head=,tail=;
for(int j=;j<=m;j++)
{
while(tail>=head&&q[tail].x>=a[i][j])
tail--;
q[++tail].x=a[i][j],q[tail].pos=j;
while(q[head].pos<=j-k)
head++;
if(j>=k)
mn[i][j]=q[head].x;
}
}
}
void solve()
{
for(int j=k;j<=m;j++)
{
int head=,tail=;
for(int i=;i<=n;i++)
{
while(tail>=head&&q[tail].x<=mx[i][j])
tail--;
q[++tail].x=mx[i][j],q[tail].pos=i;
while(q[head].pos<=i-k)
head++;
if(i>=k)
t1[i][j]=q[head].x;
}
}
for(int j=k;j<=m;j++)
{
int head=,tail=;
for(int i=;i<=n;i++)
{
while(tail>=head&&q[tail].x>=mn[i][j])
tail--;
q[++tail].x=mn[i][j],q[tail].pos=i;
while(q[head].pos<=i-k)
head++;
if(i>=k)
t2[i][j]=q[head].x;
}
}
int ans;
for(int i=k;i<=n;i++)
{
for(int j=k;j<=m;j++)
{
if(i==k&&j==k) ans=t1[i][j]-t2[i][j];
else ans=min(ans,t1[i][j]-t2[i][j]);
}
}
printf("%d\n",ans);
}
int main()
{
n=read();m=read();k=read();
for(int i=;i<=n;i++)
{
for(int j=;j<=m;j++)
{
a[i][j]=read();
}
}
pre();
solve();
return ;
}
单调队列
【单调队列】bzoj 1407 [HAOI2007]理想的正方形的更多相关文章
- 【单调队列】bzoj1047 [HAOI2007]理想的正方形
先把整个矩阵处理成b[n][m-K+1].c[n][m-K+1]大小的两个矩阵,分别存储每行每K个数中的最大.最小值,然后再通过b.c处理出d.e分别表示K*K大小的子矩阵中的最大.最小值即可.单调队 ...
- 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]理想的正方形 单调队列瞎搞
题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一 ...
- bzoj 1047: [HAOI2007]理想的正方形【单调队列】
没有复杂结构甚至不长但是写起来就很想死的代码类型 原理非常简单,就是用先用单调队列处理出mn1[i][j]表示i行的j到j+k-1列的最小值,mx1[i][j]表示i行的j到j+k-1列的最大值 然后 ...
- BZOJ 1047: [HAOI2007]理想的正方形
题目 单调队列是个很神奇的东西,我以前在博客写过(吧) 我很佩服rank里那些排前几的大神,700ms做了时限10s的题,简直不能忍.(但是我还是不会写 我大概一年半没写单调队列,也有可能根本没有写过 ...
- 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)
[BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
随机推荐
- 2017“编程之美”终章:AI之战勇者为王
编者按:8月15日,第六届微软“编程之美”挑战赛在选手的火热比拼中圆满落下帷幕.“编程之美”挑战赛是由微软主办,面向高校学生开展的大型编程比赛.自2012年起,微软每年都在革新比赛命题.紧跟时代潮流, ...
- 连接MongoDB数据库的配置说明
- 爬虫基本原理及requests,response详解
一.爬虫基本原理 1.爬虫是什么 #1.什么是互联网? 互联网是由网络设备(网线,路由器,交换机,防火墙等等)和一台台计算机连接而成,像一张网一样. #2.互联网建立的目的? 互联网的核心价值在于数据 ...
- EJB配置jboss数据源
1.数据源的模板在\jboss-4.2.3.GA-jdk6\jboss-4.2.3.GA\docs\examples\jca\下2.编辑数据源文件,比如mysql-ds.xml,命名规则是名称-ds. ...
- 贴一发STL源码
int my_lower_bound(int size, long long key){ int first = 0, middle; int half, len; len = si ...
- k8s学习目录
目录 K8S基础部分 基础部分 5 秒创建 k8s 集群[转] k8s 核心功能[转] k8s 重要概念[转] 部署 k8s Cluster(上)[转] 部署 k8s Cluster(下)[转] Ku ...
- win7上安装虚拟机并上网
一.安装Workstation Pro 二.下载CentOS-7-x86_64-DVD-1511.iso包 三.创建新的虚拟机,按照向导安装即可 四.使用cd /etc/sysconfig/netwo ...
- Jascript原型链以及Object和Function之间的关系
先看一个简单的function变量 function fun1(name) { this.name = name; } console.log("fun1", fun1) 从结果可 ...
- spark 省份次数统计实例
//统计access.log文件里面IP地址对应的省份,并把结果存入到mysql package access1 import java.sql.DriverManager import org.ap ...
- 8 Java 归并排序(MergerSort)
图片素材与文字描述来自:尚硅谷-韩顺平数据结构与算法. 1.基本思想 归并排序是利用归并的思想实现的排序方法,该算法采用经典的分治(divide-and-conquer)策略(分治法将问题分(divi ...