【题目链接】

点击打开链接

【算法】

单调队列

【代码】

#include<bits/stdc++.h>
using namespace std;
#define MAXN 1010
const int INF = 2e9; int i,j,a,b,n,ans = INF;
deque<int> q1,q2;
int val[MAXN][MAXN],mx[MAXN][MAXN],mn[MAXN][MAXN]; template <typename T> inline void read(T &x)
{
int f = ; x = ;
char c = getchar();
for (; !isdigit(c); c = getchar()) { if (c == '-') f = -f; }
for (; isdigit(c); c = getchar()) x = (x << ) + (x << ) + c - '';
x *= f;
}
template <typename T> inline void write(T x)
{
if (x < )
{
putchar('-');
x = -x;
}
if (x > ) write(x/);
putchar(x%+'');
}
template <typename T> inline void writeln(T x)
{
write(x);
puts("");
} int main() { read(a); read(b); read(n);
for (i = ; i <= a; i++)
{
for (j = ; j <= b; j++)
{
read(val[i][j]);
}
}
for (i = ; i <= b; i++)
{
q1.clear(); q2.clear();
for (j = ; j < n; j++)
{
while ((!q1.empty()) && (val[q1.back()][i] <= val[j][i])) q1.pop_back();
q1.push_back(j);
while ((!q2.empty()) && (val[q2.back()][i] >= val[j][i])) q2.pop_back();
q2.push_back(j);
}
for (j = n; j <= a; j++)
{
while ((!q1.empty()) && (j - q1.front() >= n)) q1.pop_front();
while ((!q2.empty()) && (j - q2.front() >= n)) q2.pop_front();
while ((!q1.empty()) && (val[q1.back()][i] <= val[j][i])) q1.pop_back();
q1.push_back(j);
while ((!q2.empty()) && (val[q2.back()][i] >= val[j][i])) q2.pop_back();
q2.push_back(j);
mx[j][i] = val[q1.front()][i];
mn[j][i] = val[q2.front()][i];
}
}
for (i = n; i <= a; i++)
{
q1.clear(); q2.clear();
for (j = ; j < n; j++)
{
while ((!q1.empty()) && (mx[i][q1.back()] <= mx[i][j])) q1.pop_back();
q1.push_back(j);
while ((!q2.empty()) && (mn[i][q2.back()] >= mn[i][j])) q2.pop_back();
q2.push_back(j);
}
for (j = n; j <= b; j++)
{
while ((!q1.empty()) && (j - q1.front() >= n)) q1.pop_front();
while ((!q2.empty()) && (j - q2.front() >= n)) q2.pop_front();
while ((!q1.empty()) && (mx[i][q1.back()] <= mx[i][j])) q1.pop_back();
q1.push_back(j);
while ((!q2.empty()) && (mn[i][q2.back()] >= mn[i][j])) q2.pop_back();
q2.push_back(j);
ans = min(ans,mx[i][q1.front()]-mn[i][q2.front()]);
}
}
writeln(ans); return ; }

【HAOI 2007】 理想的正方形的更多相关文章

  1. [HAOI 2007]理想的正方形

    Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. Input 第一行为3个整数,分别表示a,b,n的值第二行至第 ...

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

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

  3. 【bzoj1047】理想的正方形

    [bzoj1047]理想的正方形 题意 给定\(a*b\)由整数组成的矩形. 现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值 的差最小. \(1\leq a,b\leq 10 ...

  4. HAOI2007 理想的正方形

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1402  Solved: 738[Submit][Sta ...

  5. RAM——[HAOI2007]理想的正方形

    题目:[HAOI2007]理想的正方形 描述: [问题描述] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [输入]: 第一行为3个 ...

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

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

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

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

  8. 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)

    [BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...

  9. bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形

    http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...

  10. 【BZOJ1047】[HAOI2007]理想的正方形

    [BZOJ1047][HAOI2007]理想的正方形 题面 bzoj 洛谷 题解 二维\(st\)表,代码是以前的 #include<iostream> #include<cstdi ...

随机推荐

  1. 树莓派 -- oled 续(2) python

    上文中的代码通过wiringPi的API调用devfs API来显示图片. 这里分析的Python代码也通过类似的方法来显示图片. 主要用到了两个Library. import spidev impo ...

  2. LeetCode 303. Range Sum Query – Immutable

    Given an integer array nums, find the sum of the elements between indices i and j (i ≤ j), inclusive ...

  3. IDEA的Maven Projects无法显示

    记一个小坑: 前两天重装了一下电脑系统,下载了个最新的IDEA2018.3.5,把Maven.JDK.TomCat都设置好了 今天打开IDEA创建一个新的Maven项目,项目没有显示让我导入Maven ...

  4. 04001_HTML简单介绍

    1.超文本标记语言 (1)超文本:比普通文本功能更加强大: (2)标记语言:使用一组标签对内容进行描述的一门语言,它不是编程语言! 2.HTML语法和规范 (1)所有的html文件后缀名都是以.htm ...

  5. 动态规划之最长递增子序列(LIS)

           在一个已知的序列{ a1,a2,……am}中,取出若干数组成新的序列{ ai1, ai2,…… aim},其中下标 i1,i2, ……im保持递增,即新数列中的各个数之间依旧保持原数列中 ...

  6. [luoguP1045] 麦森数(快速幂 + 高精度)

    传送门 这道题纯粹是考数学.编程复杂度不大(别看我写了一百多行其实有些是可以不必写的). 计算位数不必用高精时刻存,不然可想而知时间复杂度之大.首先大家要知道一个数学公式 logn(a*b)=logn ...

  7. js重新讲解继承,es5的一些继承,es6继承的改变 ----------由浅入深

    es5 利用原型公有私有继承 function Parent(name) { this.name = name } Parent.prototype.home = '北京'; function Chi ...

  8. msp430入门学习13

    msp430的定时器--Timer_B(定时器B)

  9. how to read openstack code: Neutron architecture

    今天这一章节非常重要.我们知道neutron是一个非常复杂的系统,由很多组件构成.研究这样一个复杂的系统,正确的顺序应该是现在宏观上对其整体结构有所了解,然后再由针对性的对其组件进行深入了解.本章要做 ...

  10. 排列组合(permutation)系列解题报告

    本文解说4道关于permutation的题目: 1. Permutation:输出permutation--基础递归 2. Permutation Sequence: 输出字典序排列的第k个permu ...