P2216 [HAOI2007]理想的正方形(dp+单调队列优化)
题目链接:传送门
题目:
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
输入输出格式
输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。 输出格式: 仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。 输入输出样例
输入样例#: 输出样例#: 说明 问题规模 ()矩阵中的所有数都不超过1,,, ()%的数据2<=a,b<=,n<=a,n<=b,n<= ()%的数据2<=a,b<=,n<=a,n<=b,n<=
思路:
用2*b个单调队列维护:
每列长度为n的最大值和最小值;
再用2个单调队列维护:
更新到当前行为止,行数为n的最大值的最大值,和最小值的最小值。
#include <bits/stdc++.h> using namespace std;
const int MAX_N = 1e3 + ;
const int INF = 0x3f3f3f3f; struct Node{
int val, ind;
Node(int v = , int i = ) : val(v), ind(i) {}
}querow[MAX_N], quecol[MAX_N][MAX_N], querow2[MAX_N], quecol2[MAX_N][MAX_N]; int a, b, n;
int headrow, tailrow, headcol[MAX_N], tailcol[MAX_N];
int headrow2, tailrow2, headcol2[MAX_N], tailcol2[MAX_N];
int mat[MAX_N][MAX_N]; int main()
{
cin >> a >> b >> n;
int ans = INF;
for (int i = ; i <= a; i++)
for (int j = ; j <= b; j++)
scanf("%d", &mat[i][j]);
for (int i = ; i <= a; i++)
headcol[i] = , tailcol[i] = , headcol2[i] = , tailcol2[i] = ;
for (int i = ; i <= a; i++) {
headrow = headrow2 = ;
tailrow = tailrow2 = ;
for (int j = ; j <= b; j++) {
while (headcol[j] <= tailcol[j] && quecol[j][tailcol[j]].val <= mat[i][j])
tailcol[j]--;
quecol[j][++tailcol[j]] = Node(mat[i][j], i);
while (headcol[j] <= tailcol[j] && quecol[j][headcol[j]].ind <= i-n)
headcol[j]++;
Node cur = quecol[j][headcol[j]];
while (headrow <= tailrow && querow[tailrow].val <= cur.val)
tailrow--;
querow[++tailrow] = Node(cur.val, j);
while (headrow <= tailrow && querow[headrow].ind <= j-n)
headrow++;
Node _max = querow[headrow]; while (headcol2[j] <= tailcol2[j] && quecol2[j][tailcol2[j]].val >= mat[i][j])
tailcol2[j]--;
quecol2[j][++tailcol2[j]] = Node(mat[i][j], i);
while (headcol2[j] <= tailcol2[j] && quecol2[j][headcol2[j]].ind <= i-n)
headcol2[j]++;
Node cur2 = quecol2[j][headcol2[j]];
while (headrow2 <= tailrow2 && querow2[tailrow2].val >= cur2.val)
tailrow2--;
querow2[++tailrow2] = Node(cur2.val, j);
while (headrow2 <= tailrow2 && querow2[headrow2].ind <= j-n)
headrow2++;
Node _min = querow2[headrow2];
if (i >= n && j >= n)
ans = min(ans, _max.val - _min.val);
}
}
cout << ans << endl;
return ;
}
P2216 [HAOI2007]理想的正方形(dp+单调队列优化)的更多相关文章
- 洛谷P2216 HAOI2007 理想的正方形 (单调队列)
题目就是要求在n*m的矩形中找出一个k*k的正方形(理想正方形),使得这个正方形内最值之差最小(就是要维护最大值和最小值),显然我们可以用单调队列维护. 但是二维平面上单调队列怎么用? 我们先对行处理 ...
- [P2216] [HAOI2007]理想的正方形 「单调队列」
思路:用单调队列分别维护行与列. 具体实现方法:是先用单调队列对每一行的值维护,并将a[][]每个区间的最大值,最小值分别存在X[][]和x[][]中. 那么X[][]与x[][]所存储的分别是1×n ...
- Luogu 2216 [HAOI2007]理想的正方形 (单调队列优化)
题意: 给出一个 N×M 的矩阵,以及一个数值 K ,求在给定的矩阵中取出一个 K×K 的矩阵其中最大值减去最小值的最小值. 细节: 没有细节来发暴力走天下,20分也是分啊~~~ QAQ. 分析: 感 ...
- 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)
[BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...
- [BZOJ 1047] [HAOI2007] 理想的正方形 【单调队列】
题目链接:BZOJ - 1047 题目分析 使用单调队列在 O(n^2) 的时间内求出每个 n * n 正方形的最大值,最小值.然后就可以直接统计答案了. 横向有 a 个单调队列(代码中是 Q[1] ...
- 【BZOJ】1047: [HAOI2007]理想的正方形(单调队列/~二维rmq+树状数组套树状数组)
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 树状数组套树状数组真心没用QAQ....首先它不能修改..而不修改的可以用单调队列做掉,而且更 ...
- bzoj 1047: [HAOI2007]理想的正方形【单调队列】
没有复杂结构甚至不长但是写起来就很想死的代码类型 原理非常简单,就是用先用单调队列处理出mn1[i][j]表示i行的j到j+k-1列的最小值,mx1[i][j]表示i行的j到j+k-1列的最大值 然后 ...
- P2216 [HAOI2007]理想的正方形 (单调队列)
题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...
- 洛谷 P2216 [HAOI2007]理想的正方形
P2216 [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一 ...
- [poj3017] Cut the Sequence (DP + 单调队列优化 + 平衡树优化)
DP + 单调队列优化 + 平衡树 好题 Description Given an integer sequence { an } of length N, you are to cut the se ...
随机推荐
- MyBatis Spring整合配置映射接口类与映射xml文件
本文转自http://blog.csdn.net/zht666/article/details/38706083 Spring整合MyBatis使用到了mybatis-spring,在配置mybati ...
- web前端开发面试题(答案)
1.xhtml和html有什么区别? HTML是一种基本的WEB网页设计语言,XHTML是一个基于XML的置标语言最主要的不同:XHTML 元素必须被正确地嵌套.XHTML 元素必须被关闭.标签名必须 ...
- js 复制对象的深复制与浅复制
1.潜复制(修改新对象会改变原对象) var baz = {a:'hello', b: {c:'my', d:'friend'}} var foo = baz foo.a="better&q ...
- 技术宅学习Linux系统还是很有前途的
老实说,我之所以入了Linux的坑,纯粹只是为了追我现在的男朋友,也就是技术宅.如果不是为了追我男朋友的话,我估计我这辈子都不会去接触linux.好吧,今天写一写过往事情,也是为了怀念当初追男友的一些 ...
- 关于执行findbugs,checkstyle,jacoco插件检测代码,GitHook的脚本编写
Git钩子的作用: (pre-commit ) 在用户执行 git commit -m "xxx" 命令之前,先执行pre-commit文件中的脚本命令 在pre-commit文件 ...
- sas 选择一段日期,和一定周期,生成日期序列和周期序列
工作需要,得选择一段日期,和一定周期,生成日期序列和周期序列.暂时用七天为一个周期 data d; format date date9.; do date='04mar2018'd to'05may2 ...
- html、xhtml、html5的区别
1.HTML:HyperText Mark-up Language(超文本标记语言)构成网页的主要语言 常指:HTML 4.012.XHTLM:EXtensible HyperText Mark-u ...
- jdk8-lanbda方法引用和构造引用
1.方法引用概念及实例 1.对象实例方法 语法格式: 对象::实例方法名称 注意点: 实例方法必须和被实现的接口中定义的方法的参数列表和返回值一致.一般适合于一个方法就实现了的. 2.类::静态方法 ...
- SQL-35 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作
题目描述 对于表actor批量插入如下数据,如果数据已经存在,请忽略,不使用replace操作CREATE TABLE IF NOT EXISTS actor (actor_id smallint(5 ...
- `define、parameter、localparam三者的区别(转)
`define: 可以跨模块的定义,写在模块名称上面,在整个设计工程都有效.一旦‘define指令被编译,其在整个编译过程中都有效.例如,通过另一个文件中的`define指令,定义的常量可以被其他文件 ...