【单调队列】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 ...
随机推荐
- js 字符串常用操作
function Class_String_Common(){ //将字符串 myString 的 start位置 和 end位置 之间的内容替换为 replaceStr this.replace1 ...
- poj 2411 Mondriaan's Dream (轮廓线DP)
题意:有一个n*m的棋盘,要求用1*2的骨牌来覆盖满它,有多少种方案?(n<12,m<12) 思路: 由于n和m都比较小,可以用轮廓线,就是维护最后边所需要的几个状态,然后进行DP.这里需 ...
- 洛谷 P1744 采购特价商品
题目背景 <爱与愁的故事第三弹·shopping>第一章. 题目描述 中山路店山店海,成了购物狂爱与愁大神的“不归之路”.中山路上有n(n<=100)家店,每家店的坐标均在-1000 ...
- java项目指向maven进行构建方式
1.在需要运行的机器中环境变量中配置maven 运行setting 4 配置环境变量 2.运行项目进行重新构建:alt+F5
- Mac下搜索神兵利器Alfred 3.1.1最新和谐版
http://bbs.feng.com/read-htm-tid-9891194.html 相比Windows而言Mac自带的Spotlight搜索已经非常强大了,尤其是Mac OS Yosemite ...
- C语言中最常用标准库函数
标准头文件包括: <asset.h> <ctype.h> <errno.h> <float.h> <limits ...
- PAT (Basic Level) Practise (中文)- 1026. 程序运行时间(15)
PAT (Basic Level) Practise (中文)- 1026. 程序运行时间(15) http://www.patest.cn/contests/pat-b-practise/10 ...
- ios 团购信息客户端demo(三)
接上二篇的内容,今天我们就来介绍一下如何将解析出来的数据放入AQGridView中显示出来,因为我们的工程中已经将AQGridView导入了,所以我们在KKFirstViewController中直接 ...
- Hanoi双塔问题
题目描述: 给定A.B.C三根足够长的细柱,在A柱上放有2n个中间有孔的圆盘,共有n个不同的尺寸,每个尺寸都有两个相同的圆盘,注意这两个圆盘是不加区分的(下图为n=3的情形).现要将这些圆盘移到C柱上 ...
- python中 “==”和"is"的区别
python中 "=="是相等性比较,比较的是两个对象中的值是否相等,而“is”是一致性比较,比较的是两个对象中的内存地址 a = [1, 2, 3] b = a 此时, a == ...