二维单调队列

先横向跑一边单调队列,记录下每一行长度为n的区间的最值

在纵向跑一边单调队列,得出结果

注意,mi要初始化为一个足够大的数

#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
int init() {
int rv = 0, fh = 1;
char c = getchar();
while(c < '0' || c > '9') {
if(c == '-') fh = -1;
c = getchar();
}
while(c >= '0' && c <='9') {
rv = (rv<<1) + (rv<<3) + c - '0';
c = getchar();
}
return fh * rv;
}
const int MAXN = 2005;
int num[MAXN][MAXN], ma[MAXN][MAXN], mi[MAXN][MAXN], n, a, b, ans = 0x7fffffff;
struct ddque{
int que[MAXN<<3], head, tail;
void clear(bool opt){
que[0] = opt? 0: 0x7fffffff; //注意这里
head = tail = 0;
}
void insert(int x, bool opt){
if(!opt) {
while(que[tail] > x && tail >= head) tail--;
que[++tail] = x;
}else {
while(que[tail] < x && tail >= head) tail--;
que[++tail] = x;
}
}
void pop(int x){
if(que[head] == x) head++;
}
int query(){
return que[head];
}
}q1, q2;
int main() {
freopen("in.txt", "r", stdin);
memset(mi,0x7f,sizeof(mi));
a = init(); b = init(); n = init();
for(int i = 1 ; i <= a ; i++) {
for(int j = 1 ; j <=b ; j++) {
num[i][j] = init();
}
}
for(int i = 1 ; i <= a ; i++) {
q1.clear(0); q2.clear(1);
for(int j = 1 ; j <= n ; j++) {
q1.insert(num[i][j], 0);
q2.insert(num[i][j], 1);
}
ma[i][n] = q2.query();
mi[i][n] = q1.query();
for(int j = n + 1 ; j <= b ; j++) {
q1.insert(num[i][j], 0);
q2.insert(num[i][j], 1);
q1.pop(num[i][j - n]);
q2.pop(num[i][j - n]);
ma[i][j] = q2.query();
mi[i][j] = q1.query();
}
}
for(int j = n ; j <= b ; j++) {
q1.clear(0); q2.clear(1);
for(int i = 1 ; i <= n ; i++) {
q1.insert(mi[i][j], 0);
q2.insert(ma[i][j], 1);
}
ans = min(ans, q2.query() - q1.query());
for(int i = n + 1 ; i <= a ; i++) {
q1.insert(mi[i][j], 0);
q2.insert(ma[i][j], 1);
q1.pop(mi[i - n][j]);
q2.pop(ma[i - n][j]);
ans = min(ans, q2.query() - q1.query());
}
}
cout<<ans<<endl;
fclose(stdin);
return 0;
}

洛谷 [P2216] 理想的正方形的更多相关文章

  1. 洛谷P2216 理想的正方形(单调队列)

    洛谷P2216 理想的正方形 题目链接 思路: 直接暴力显然不可行,可以发现每一个矩形向右边扩展时是一列一列增加,于是可以想到单调队列,用数组来维护当前每列的最大值.因为行也有限制,所以还要用一个单调 ...

  2. 洛谷P2216 理想的正方形

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

  3. 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP

    洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...

  4. 洛谷 P2216 [HAOI2007]理想正方形

    洛谷 巨说这是一道单调队列好题,但是我并不是用单调队列做的诶. 如果往最暴力的方向去想,肯定是\(n^3\)的\(dp\)了. \(f[i][j][k]\)代表当前正方形的左上角定点是\((i,j)\ ...

  5. 洛谷 P2216 [HAOI2007]理想的正方形

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

  6. 【洛谷P2216】[HAOI2007]理想的正方形

    理想的正方形 [题目描述] 一个a*b的矩阵,从中取一个n*n的子矩阵,使所选矩阵中的最大数与最小数的差最小. 思路: 二维的滑动窗口 对于每行:用一个单调队列维护,算出每个长度为n的区间的最大值和最 ...

  7. 洛谷 P2216 [HAOI2007]理想的正方形 || 二维RMQ的单调队列

    题目 这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值.最小和最大值的求法类似. 单调队列做法: 以最小值为例: q1[i][j]表示第i行上,从j列开始的n列的最小值.$q1 ...

  8. 洛谷P2216 HAOI2007 理想的正方形 (单调队列)

    题目就是要求在n*m的矩形中找出一个k*k的正方形(理想正方形),使得这个正方形内最值之差最小(就是要维护最大值和最小值),显然我们可以用单调队列维护. 但是二维平面上单调队列怎么用? 我们先对行处理 ...

  9. 【DP】【单调队列】洛谷 P2216 [HAOI2007]理想的正方形 题解

        算是单调队列的复习吧,不是很难 题目描述 有一个$a\times b$的整数组成的矩阵,现请你从中找出一个$n\times n$的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 ...

随机推荐

  1. ubuntu 14.04 安装mysql,并配置远程连接和中文乱码

    1. 安装MySQL的jar root@computer-PowerEdge-T30:~# sudo apt-get install mysql-server mysql-client在本次安装中,根 ...

  2. Tensorflow_入门学习_1

    1.0 TensorFlow graphs Tensorflow是基于graph based computation: 如: a=(b+c)∗(c+2) 可分解为 d=b+c e=c+2 a=d∗e ...

  3. android 焦点 ListView 点击事件获取失败

    1. 在ListView 中, 创建一个app_item.xml 布局文件 在布局文件中有如下的代码:  <CheckBox         android:id="@+id/cb_t ...

  4. abp viewmodel的写法

    我的写法 public class QuotaCreateOrEditViewModel { public QuotaDto LoanQuota { get; set; } public bool I ...

  5. 爬虫_python3_urllib

    urlib库为python3的HTTP内置请求库 urilib的四个模块: urllib.request:用于获取网页的响应内容 urllib.error:异常处理模块,用于处理异常的模块 urlli ...

  6. Springboot邮箱接口(使用个人邮箱发送邮件)

    近期项目使用邮件验证,这里使用个人邮箱进行测试,记录开发笔记 SpringBoot自带短信接口 maven pom.xml 引入: <dependency> <groupId> ...

  7. Bootstrap历练实例:危险样式按钮

    <!DOCTYPE html><html><head> <meta http-equiv="Content-Type" content=& ...

  8. js之数组知识

    一.数组的定义(来源于Array.prototype) 1.构造函数方法: (1)var arr = new Array();//没有参数等价于 var arr = []; (2)var arr = ...

  9. PAT 乙级 1033

    题目 题目地址:PAT 乙级 1033 题解 本题一直有一分的样例点过不了,原因在于用了cin接收输入的字符…… 问题在于:如果用cin输入,无法接收无坏键的情况的输入,需要getline作为输入:这 ...

  10. ccf_201712-2

    题目 问题描述 有n个小朋友围成一圈玩游戏,小朋友从1至n编号,2号小朋友坐在1号小朋友的顺时针方向,3号小朋友坐在2号小朋友的顺时针方向,……,1号小朋友坐在n号小朋友的顺时针方向. 游戏开始,从1 ...