洛谷P2216 HAOI2007 理想的正方形 (单调队列)
题目就是要求在n*m的矩形中找出一个k*k的正方形(理想正方形),使得这个正方形内最值之差最小(就是要维护最大值和最小值),显然我们可以用单调队列维护。
但是二维平面上单调队列怎么用?
我们先对行处理,将其压缩为一个(n-k+1)*m的矩形;再对列进行处理,最终压缩为一个(n-k+1)*(m-k+1)的矩形,枚举最大与最小之差,更新答案即可。
- 1 #include<bits/stdc++.h>
- 2 using namespace std;
- 3 const int N=1e3+1;
- 4 int n,m,k,a[N][N],ans;
- 5 int qmax[N],qmin[N],h1,t1,h2,t2;
- 6 int Max1[N][N],Min1[N][N],Max2[N][N],Min2[N][N];
- 7 int main(){
- 8 scanf("%d%d%d",&n,&m,&k);
- 9 for(int i=1;i<=n;i++)
- 10 for(int j=1;j<=m;j++)
- 11 scanf("%d",&a[i][j]);
- 12
- 13 for(int i=1;i<=n;i++){
- 14 h1=1,t1=0,h2=1,t2=0;
- 15 qmax[++t1]=1;qmin[++t2]=1;
- 16 for(int j=2;j<=m;j++){
- 17 while(h1<=t1 && a[i][j]>=a[i][qmax[t1]]) t1--;
- 18 qmax[++t1]=j;
- 19 while(h2<=t2 && a[i][j]<=a[i][qmin[t2]]) t2--;
- 20 qmin[++t2]=j;
- 21 while(h1<=t1 && qmax[h1]<j-k+1) h1++;
- 22 while(h2<=t2 && qmin[h2]<j-k+1) h2++;
- 23 if(j>=k){
- 24 Max1[i][j-k+1]=a[i][qmax[h1]];
- 25 Min1[i][j-k+1]=a[i][qmin[h2]];
- 26 }
- 27 }
- 28 }
- 29
- 30 for(int j=1;j<=m-k+1;j++){
- 31 h1=1,t1=0,h2=1,t2=0;
- 32 qmax[++t1]=1;qmin[++t2]=1;
- 33 for(int i=2;i<=n;i++){
- 34 while(h1<=t1 && Max1[i][j]>=Max1[qmax[t1]][j]) t1--;
- 35 qmax[++t1]=i;
- 36 while(h2<=t2 && Min1[i][j]<=Min1[qmin[t2]][j]) t2--;
- 37 qmin[++t2]=i;
- 38 while(h1<=t1 && qmax[h1]<i-k+1) h1++;
- 39 while(h2<=t2 && qmin[h2]<i-k+1) h2++;
- 40 if(i>=k){
- 41 Max2[i-k+1][j]=Max1[qmax[h1]][j];
- 42 Min2[i-k+1][j]=Min1[qmin[h2]][j];
- 43 }
- 44
- 45 }
- 46 }
- 47 ans=0x3f3f3f3f;
- 48 for(int i=1;i<=n-k+1;i++)
- 49 for(int j=1;j<=m-k+1;j++)
- 50 ans=min(ans,Max2[i][j]-Min2[i][j]);
- 51 cout<<ans;
- 52 }
用了不知多少次的单调队列,最终压缩的矩形中每个格子代表的意义是:以它为右下角的n*n的正方形。
洛谷P2216 HAOI2007 理想的正方形 (单调队列)的更多相关文章
- 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP
洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...
- 洛谷 P2216 [HAOI2007]理想的正方形
P2216 [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一 ...
- P2216 [HAOI2007]理想的正方形 (单调队列)
题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...
- 洛谷 P2216 [HAOI2007]理想的正方形 || 二维RMQ的单调队列
题目 这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值.最小和最大值的求法类似. 单调队列做法: 以最小值为例: q1[i][j]表示第i行上,从j列开始的n列的最小值.$q1 ...
- 【DP】【单调队列】洛谷 P2216 [HAOI2007]理想的正方形 题解
算是单调队列的复习吧,不是很难 题目描述 有一个$a\times b$的整数组成的矩阵,现请你从中找出一个$n\times n$的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 ...
- [洛谷P2216][HAOI2007]理想的正方形
题目大意:有一个$a\times b$的矩阵,求一个$n\times n$的矩阵,使该区域中的极差最小. 题解:二维$ST$表,每一个点试一下是不是左上角就行了 卡点:1.用了一份考试时候写的二维$S ...
- 洛谷 P2216 [HAOI2007]理想正方形
洛谷 巨说这是一道单调队列好题,但是我并不是用单调队列做的诶. 如果往最暴力的方向去想,肯定是\(n^3\)的\(dp\)了. \(f[i][j][k]\)代表当前正方形的左上角定点是\((i,j)\ ...
- 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 ...
随机推荐
- JS for in / foreach / for of 超简单对照解释
for in 可以遍历数组/对象/字符串/enumerable对象,得到的是索引,遍历对象时可以写这样 obj[index] 代表对象当前的属性foreach 只能遍历数组,不能遍历字符串.对象for ...
- 鲜衣怒马散尽千金,Vue3.0+Tornado6前后端分离集成Web3.0之Metamask钱包区块链虚拟货币三方支付功能
原文转载自「刘悦的技术博客」https://v3u.cn/a_id_219 不得不承认,大多数人并不拥有或者曾经拥有加密货币.是的,Web3.0.加密货币.区块链,对于大多数的互联网用户来说,其实是一 ...
- 关于微信豆苹果(IOS)用户1比10充值方法
微信iOS端微信7.0.20版本之后就上线了微信豆功能,相比大家对微信豆已经不陌生了. 微信官方现在给出了微信豆的含义,微信豆是用于支付微信内虚拟物品的道具,支持在视频号中购买虚拟礼物.也可以对公 ...
- 巨细靡遗流程控制,Go lang1.18入门精炼教程,由白丁入鸿儒,Go lang流程结构详解EP09
流程结构就是指程序逻辑到底怎么执行,进而言之,程序执行逻辑的顺序.众所周知,程序整体都是自上由下执行的,但有的时候,又不仅仅是从上往下执行那么简单,大体上,Go lang程序的流程控制结构一共有三种: ...
- nmtui 字符界面图形模式配置
一.通过nmtui配置网络参数 Linux系统配置网络参数的方式有很多种,其中最简单最直接的方式就是直接修改网卡配置文件,但这种方式也很容易出错,比如说IPADDR.NETMASK.GATEWAY等参 ...
- Springboot 通过FastJson实现bean对象和Json字符串互转
Json格式在后台服务中的重要性就不多说了,直入正题.首先引入pom文件,这里使用的是1.2.83版本 1 <dependency> 2 <groupId>com.alibab ...
- 来瞧瞧,WPF 炫酷走马灯!
来瞧瞧,WPF 炫酷走马灯! 控件名:SpotLight 作者:WPFDevelopersOrg 原文链接: https://github.com/WPFDevelopersOrg/WPFDevelo ...
- flask 可插拔视图
Flask 0.7 版本引入了可插拨视图.可插拨视图基于使用类来代替函数,其灵感来自于 Django 的通用视图.可插拨视图的主要用途是用可定制的.可插拨的视图来替代部分 实现.普通的函数视图 演示代 ...
- Qt QBarSeries简易柱状图教程
博客园最强Qt QBarSeries简易柱状图教程 前情提要 每个人的绘图需求不同,此篇教程也是根据需求来改的.我的需求大概如下所示. 通过信号槽的方式接收signals来刷新柱状图,所以每次触发信号 ...
- Linux之搭建FTP服务
引用:FTP服务器(File Transfer Protocol Server)是在互联网上提供文件存储和访问服务的计算机,它们依照FTP协议提供服务. FTP是File Transfer Proto ...