洛谷P2216 理想的正方形(单调队列)
洛谷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 理想的正方形(单调队列)的更多相关文章
- 洛谷P2216 理想的正方形
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...
- 洛谷 [P2216] 理想的正方形
二维单调队列 先横向跑一边单调队列,记录下每一行长度为n的区间的最值 在纵向跑一边单调队列,得出结果 注意,mi要初始化为一个足够大的数 #include <iostream> #incl ...
- 【BZOJ】4721: [Noip2016]蚯蚓 / 【洛谷】P2827 蚯蚓(单调队列)
Description 本题中,我们将用符号[c]表示对c向下取整,例如:[3.0」= [3.1」=[3.9」=3.蛐蛐国最近蚯蚓成灾了!隔壁跳 蚤国的跳蚤也拿蚯蚓们没办法,蛐蛐国王只好去请神刀手来帮 ...
- 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP
洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...
- P2216 [HAOI2007]理想的正方形 (单调队列)
题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp
题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2369 Solved: 1266[Submi ...
- BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )
单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是 ...
- 洛谷.2219.[HAOI2007]修筑绿化带(单调队列)
题目链接 洛谷 COGS.24 对于大的矩阵可以枚举:对于小的矩阵,需要在满足条件的区域求一个矩形和的最小值 预处理S2[i][j]表示以(i,j)为右下角的C\(*\)D的矩阵和, 然后对于求矩形区 ...
随机推荐
- 配置keepalived支持nginx高可用
实验环境 序号 主机名 IP地址 1 nginx1 192.168.204.11 2 nginx2 192.168.204.12 安装nginx 安装nginx yum install -y epel ...
- [Gamma]阶段发布说明
小小易校园微信小程序发布说明 第二版小小易校园小程序发布啦~ 打开微信,点击右上角➕,选择扫一扫,扫描以下二维码即可进入小程序: 版本功能: 上一版功能请参见[Beta阶段]发布说明. 当前版本的更新 ...
- windows下Apache2.4配置php的解析运行
1.安装php7 2.安装apache2.4 3.找到apache2.4的httpd.conf文件,配置好apache,然后通过httpd.exe -k install -n "servic ...
- Python3+Robot Framework+RIDE安装使用教程
一.说明 Python3----网上很多文章都是用Python2,Robot Framework的部分文档没更新也直接写着不支持Python3(如RIDE does not yet support P ...
- SpringBoot扩展点之二:ApplicationRunner和CommandLineRunner的扩展
CommandLineRunner并不是Spring框架原有的概念,它属于SpringBoot应用特定的回调扩展接口: public interface CommandLineRunner { /** ...
- spring Valid @Pattern 常见的验证表达式
1 匹配首尾空格的正则表达式:(^\s*)|(\s*$) 2 整数或者小数:^[0-9]+\.{0,1}[0-9]{0,2}$ 3 只能输入数字:"^[0-9]*$". 4 只 ...
- 从nsurlsession、Alamofire到moya
更好的理解(抽象).更少的构建(配置).更方便的表达(语言) 一.iOS系统的网络编程(DSL概念) ios缺省的网络编程只是给出了网络编程的基本概念: urlsession.request.resp ...
- python修改linux日志(logtamper.py)
原作者原文:https://blog.csdn.net/qq_27446553/article/details/51434451 躲避管理员who查看 python logtamper.py -m - ...
- ES集群7.3.0设置快照,存储库进行索引备份和恢复等
说明:三台ES节点组成ES集群,一台kibana主机,版本均是7.3.0,白金试用版 官方地址:https://www.elastic.co/guide/en/elasticsearch/refere ...
- C#文件操作之把一个文件复制到另外一个文件夹下
一.文件复制例子如下,具体情况,根据需求扩展. /// <summary> /// /// </summary> /// <param name="srcFol ...