题目链接:http://61.187.179.132/JudgeOnline/problem.php?id=1047

题意:给出一个n*m的矩阵。在所有K*K的子矩阵中,最大最小差值最小的是多少?

思路:枚举每一行,枚举每一列,(r,c),将(r-K+1,c-K+1)中的数字插入到单调队列中保存(这里设置两个单调队列,一个最大一个最小)。每次计算以(r,c)为右下角的子矩阵的值时,判断队列头元素的列数是不是大于等于c-K+1,否则删掉队头。插入时,比如维护最小的单调队列,要判断队尾的元素是不是小于当前元素,不小于则删掉队尾。

int n,m,K;
pair<int,int> Q1[N],Q2[N];
int head1,tail1,head2,tail2;
int c[N][N];

pair<int,int> get(int r1,int r2,int t)
{
    int Min=INF,Max=-INF,i;
    FOR(i,r1,r2)
    {
        Min=min(Min,c[i][t]);
        Max=max(Max,c[i][t]);
    }
    return MP(Min,Max);
}

int cal(int r)
{
    head1=tail1=head2=tail2=0;
    int i,x,y,ans=INF;
    pair<int,int> p;
    for(i=1;i<=m;i++)
    {
        p=get(r-K+1,r,i);
        x=p.first;
        y=p.second;

while(head1<tail1&&Q1[tail1-1].second>=x) tail1--;
        Q1[tail1++]=MP(i,x);

while(head2<tail2&&Q2[tail2-1].second<=y) tail2--;
        Q2[tail2++]=MP(i,y);

if(i<K) continue;

while(Q1[head1].first<i-K+1) head1++;
        x=Q1[head1].second;

while(Q2[head2].first<i-K+1) head2++;
        y=Q2[head2].second;

if(y-x<ans) ans=y-x;
    }
    return ans;
}

int main()
{
    RD(n,m,K);
    int i,j;
    FOR1(i,n) FOR1(j,m) RD(c[i][j]);
    int ans=INF,temp;
    for(i=K;i<=n;i++)
    {
        temp=cal(i);
        if(temp<ans) ans=temp;
    }
    PR(ans);
    return 0;
}

BZOJ 1047 理想的正方形(单调队列)的更多相关文章

  1. bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp

    题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2369  Solved: 1266[Submi ...

  2. BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )

    单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是 ...

  3. BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞

    题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一 ...

  4. BZOJ1047: [HAOI2007]理想的正方形 [单调队列]

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][St ...

  5. P2216 [HAOI2007]理想的正方形 (单调队列)

    题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...

  6. [BZOJ]1047 理想的正方形(HAOI2007)

    真·水题.小C本来是不想贴出来的,但是有一股来自东方的神秘力量催促小C发出来. Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和 ...

  7. BZOJ 1047 理想的正方形

    单调队列的基本应用. #include<iostream> #include<cstdio> #include<cstring> #include<algor ...

  8. bzoj1047/luogu2216 理想的正方形 (单调队列)

    开b组单调队列,分别维护此时某一列中的最大/最小值 然后我每次把它们的头取出来,塞到维护行的单调队列里,就是n*n的最大/最小值 #include<bits/stdc++.h> #defi ...

  9. luogu 2216 理想的正方形 单调队列(其实没有DP)

    #include<bits/stdc++.h> using namespace std; ; ; int a,b,n; int g[A][A],q[A][N],Q[A][N]; int h ...

随机推荐

  1. Leetcode#61 Rotate List

    原题地址 我一直不太理解为什么叫rotate,翻译成"旋转"吧,似乎也不像啊.比如: 1->2->3->4->5->NULL 向右旋转2的距离,变成了 ...

  2. BLUR

    ssao的blur遇到个麻烦 花了两三天时间...终于大概知道原因了. 在nvidia的ssao(http://developer.download.nvidia.com/SDK/10.5/direc ...

  3. 查找出现次数大于n/k的重复元素

    本文是对一篇英文论文的总结:Finding Repeated Elements.想看原文,请Google之. 这个问题的简单形式是“查找出现次数大于n/2的重复元素”.我们先从简单问题开始,然后再做扩 ...

  4. windows下安装php5.2.*,php5.3.*,php5.4.*版本的memcache扩展(转)

    拓展安装调试方法: 编写调试php文件 <?php  memcache();  通过命令行执行测试,因为php拓展安装成功与否与apache无关,所以没必要不断重启apache去看phpinfo ...

  5. 异步等待的 Python 协程

    现在 Python 已经支持用协程进行异步处理.但最近有建议称添加协程以全面完善 Python 的语言结构,而不是像现在这样把他们作为生成器的一个类型.此外,两个新的关键字---异步(async)和等 ...

  6. Maven的配置文件pom.xml

    Maven的配置文件pom.xml 简介: 什么是POM? POM是项目对象模型(Project Object Model)的简称,它是Maven项目中的文件,使用XML表示,名称叫做pom.xml. ...

  7. spring_150805_datasource

    实体类: package com.spring.model; public class DogPet { private int id; private String name; private in ...

  8. lintcode:打劫房屋 III

    题目 打劫房屋 III 在上次打劫完一条街道之后和一圈房屋之后,窃贼又发现了一个新的可以打劫的地方,但这次所有的房子组成的区域比较奇怪,聪明的窃贼考察地形之后,发现这次的地形是一颗二叉树.与前两次偷窃 ...

  9. 执行脚本出现bin/bash: bad interpreter: No such file or directory

    -bash: ./test.sh: /bin/bash^M: bad interpreter: No such file or directory VI打开文件,没发现任何问题, 把/bin/bash ...

  10. inno setup判断是Windows系统版本(其实还是Delphi代码,还能检查域控制器和家庭版)

    1.设置Windows最低版本要求 [Setup]: MinVersion 格式: a.bb,c.dd,这里 a.bb 是 Windows 版本,c.dd 是 Windows NT 版本. 默认值: ...