洛谷P2216 理想的正方形

题目链接

思路:

直接暴力显然不可行,可以发现每一个矩形向右边扩展时是一列一列增加,于是可以想到单调队列,用数组来维护当前每列的最大值。因为行也有限制,所以还要用一个单调队列来维护行的信息。

做法大概就是每次扩展一行,然后求出每一列当前的最大值,之后再一列一列来搞。

详见代码吧:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1005, M = 105;
int a, b, n;
int mp[N][N], tmp[N][2];
int q1[N][N], l1[N], r1[N], q2[N][N], l2[N], r2[N];
int Q1[N], Q2[N];
int main() {
ios::sync_with_stdio(false); cin.tie(0) ;
cin >> a >> b >> n;
for(int i = 1; i <= a; i++) for(int j = 1; j <= b; j++) cin >> mp[i][j] ;
for(int i = 1; i <= b; i++) l1[i] = l2[i] = 1;
int ans = 2e9;
for(int i = 1; i <= a; i++) {
for(int j = 1; j <= b; j++) {
while(l1[j] <= r1[j] && mp[q1[j][r1[j]]][j] <= mp[i][j]) r1[j]--;
q1[j][++r1[j]] = i ;
while(l2[j] <= r2[j] && mp[q2[j][r2[j]]][j] >= mp[i][j]) r2[j]--;
q2[j][++r2[j]] = i ;
while(l1[j] <= r1[j] && i + 1 - q1[j][l1[j]] > n) l1[j]++;
while(l2[j] <= r2[j] && i + 1 - q2[j][l2[j]] > n) l2[j]++;
}
for(int j = 1; j <= b; j++) tmp[j][0] = mp[q1[j][l1[j]]][j], tmp[j][1] = mp[q2[j][l2[j]]][j];
int mx = 0, mn = 1e9 + 1;
int cc1, cc2;
int L1 = 1, R1 = 0, L2 = 1, R2 = 0;
for(int j = 1; j <= b; j++) {
while(L1 <= R1 && tmp[Q1[R1]][0] <= tmp[j][0]) R1--;
while(L2 <= R2 && tmp[Q2[R2]][1] >= tmp[j][1]) R2--;
Q1[++R1] = j ;
Q2[++R2] = j ;
while(L1 <= R1 && j + 1 - Q1[L1] > n) L1++;
while(L2 <= R2 && j + 1 - Q2[L2] > n) L2++;
if(i >= n && j >= n) ans = min(ans, tmp[Q1[L1]][0] - tmp[Q2[L2]][1]);
// cout << i << ' ' << Q1[L1] << ' ' << Q2[L2] << '\n';
}
// cout << "---------------" << '\n' ;
}
cout << ans;
return 0;
}
/*
5 4 2
1 2 3 4
5 6 7 8
9 8 7 6
1 3 2 3
1 2 3 4
*/

洛谷P2216 理想的正方形(单调队列)的更多相关文章

  1. 洛谷P2216 理想的正方形

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

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

    二维单调队列 先横向跑一边单调队列,记录下每一行长度为n的区间的最值 在纵向跑一边单调队列,得出结果 注意,mi要初始化为一个足够大的数 #include <iostream> #incl ...

  3. 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)

    Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...

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

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

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

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

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

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

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

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

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

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

  9. 洛谷.2219.[HAOI2007]修筑绿化带(单调队列)

    题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区 ...

随机推荐

  1. List中的ArrayList和LinkedList源码分析

    ​ List是在面试中经常会问的一点,在我们面试中知道的仅仅是List是单列集合Collection下的一个实现类, List的实现接口又有几个,一个是ArrayList,还有一个是LinkedLis ...

  2. 监听浏览器tab选项卡选中事件,点击浏览器tab标签页回调事件,浏览器tab切换监听事件

    js事件注册代码: <script> document.addEventListener('visibilitychange',function(){ //浏览器tab切换监听事件 if( ...

  3. 本地项目git初始化并提交远程仓库

    1.先在远程仓库(如github)创建项目,为了避免错误,不要初始化 README, license, 或者gitignore文件 . 2.打开Terminal终端 3.切换到你的本地项目目录 4.初 ...

  4. Hive常见错误

    1.root is not allowed to impersonate root 修改etc/hadoop/core-site.xml,增加如下配置: <property> <na ...

  5. idea Autowired 提示红色的解决方式

  6. 记lombok@Data和@Builder一起用无法添加无参构造方法的坑

    转自:https://blog.csdn.net/w605283073/article/details/89221853 今天和小伙伴讨论一个mybatis-plus的一个诡异问题,最后定位到原因竟然 ...

  7. python selenium爬虫工具

    今天seo的同事需要一个简单的爬虫工具, 根据一个url地址,抓取改页面的a连接,然后进入a连接里面的页面再次抓取a连接 1.需要一个全局的set([])集合来保存抓取的url地址 2.由于现在单页面 ...

  8. Java的常用API之Date类简介

    Data类 java.util.Date:表示日期和时间的类类Date 表示特定的瞬间,精确到毫秒.毫秒:千分之一秒 1000毫秒=1秒 把日期转换成毫秒: 当前的日期:2019-07-18 时间原点 ...

  9. windows上 nginx 配置代理服务,配置多域名,以及最简单实现跨域配置

    Nginx,不用多说啦,大家都熟悉的不能再熟悉了,它是一款轻量级的高性能Web 服务器/反向代理服务器及电子邮件(IMAP/POP3)代理服务器,最近在本地研究将nginx和resin配合使用,使服务 ...

  10. Tomcat 配置文件解析工具 Digester

    Digester 是一个依据 xml 配置文件动态构建 Java 对象树的工具,基于 SAX 解析器进行封装,它为 SAX 事件的处理提供了更高级和友好的接口,让开发更专注于要执行的处理,隐藏了 XM ...