BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 2857 Solved: 1560
[Submit][Status][Discuss]
Description
有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值
的差最小。
Input
第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每
行相邻两数之间用一空格分隔。
100%的数据2<=a,b<=1000,n<=a,n<=b,n<=100
Output
仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。
Sample Input
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2
Sample Output
- #include <iostream>
- #include <cstdio>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- using namespace std;
- const int N=,INF=2e9+;
- inline int read(){
- char c=getchar();int x=,f=;
- while(c<''||c>''){if(c=='-')f=-;c=getchar();}
- while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
- return x*f;
- }
- int n,m,k,a[N][N];
- int mx[N][N],mn[N][N];
- int q[N],head=,tail=;
- void handle(int c){//printf("handle %d\n",c);
- head=;tail=;
- for(int i=;i<=n;i++){
- while(head<=tail&&q[head]<=i-k) head++;
- while(head<=tail&&a[i][c]>a[q[tail]][c]) tail--;
- q[++tail]=i;
- mx[i][c]=max(mx[i][c],a[q[head]][c]);
- }
- head=;tail=;
- for(int i=;i<=n;i++){
- while(head<=tail&&q[head]<=i-k) head++;//if(c==1)printf("head %d %d\n",head,q[head]);
- while(head<=tail&&a[i][c]<a[q[tail]][c]) tail--;
- q[++tail]=i;//if(c==1)printf("tail %d %d\n",tail,q[tail]);
- mn[i][c]=min(mn[i][c],a[q[head]][c]);//if(c==1)printf("mn %d %d %d\n",i,c,mn[i][c]);
- }
- }
- int f[N],g[N],ans=INF;
- void sol(int r){
- head=;tail=;
- memset(f,,sizeof(f));
- for(int j=;j<=m;j++){
- while(head<=tail&&q[head]<=j-k) head++;
- while(head<=tail&&mx[r][j]>mx[r][q[tail]]) tail--;
- q[++tail]=j;
- f[j]=max(f[j],mx[r][q[head]]);
- }
- head=;tail=;
- memset(g,,sizeof(g));
- for(int j=;j<=m;j++){
- while(head<=tail&&q[head]<=j-k) head++;
- while(head<=tail&&mn[r][j]<mn[r][q[tail]]) tail--;
- q[++tail]=j;
- g[j]=min(g[j],mn[r][q[head]]);
- }
- for(int j=k;j<=m;j++) ans=min(ans,f[j]-g[j]);//,printf("sol %d %d %d %d\n",r,j,f[j],g[j]);
- }
- int main(){
- n=read();m=read();k=read();
- for(int i=;i<=n;i++)
- for(int j=;j<=m;j++){
- a[i][j]=read();
- }
- memset(mn,,sizeof(mn));
- for(int j=;j<=m;j++) handle(j);
- for(int i=k;i<=n;i++) sol(i);
- printf("%d",ans);
- // cout<<"test\n";
- // for(int i=1;i<=n;i++)
- // for(int j=1;j<=m;j++) printf("%d %d %d %d\n",i,j,mx[i][j],mn[i][j]);
- }
BZOJ1047: [HAOI2007]理想的正方形 [单调队列]的更多相关文章
- 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) (话说还是 ...
- P2216 [HAOI2007]理想的正方形 (单调队列)
题目链接:P2216 [HAOI2007]理想的正方形 题目描述 有一个 \(a\times b\)的整数组成的矩阵,现请你从中找出一个 \(n\times n\)的正方形区域,使得该区域所有数中的最 ...
- bzoj1047/luogu2216 理想的正方形 (单调队列)
开b组单调队列,分别维护此时某一列中的最大/最小值 然后我每次把它们的头取出来,塞到维护行的单调队列里,就是n*n的最大/最小值 #include<bits/stdc++.h> #defi ...
- Luogu 2216[HAOI2007]理想的正方形 - 单调队列
Solution 二维单调队列, 这个数组套起来看得我眼瞎... Code #include<cstdio> #include<algorithm> #include<c ...
- BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞
题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一 ...
- [HAOI2007] 理想的正方形 (单调队列)
题目链接 Solution MD,经过这道题,算是掌握单调队列了... 可以先预处理出点 \((i,j)\) 往上 \(n\) 的最大值和最小值. 然后再横着做一遍单调队列即可. Code #incl ...
- 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP
洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...
- [HAOI2007]理想的正方形 单调队列 暴力
Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; #d ...
随机推荐
- Collection框架
Collection框架 集合框架(Collection Framework)泛指java.util包的若干个类和接口.如Collection,List,ArrayList,LinkedList,Ve ...
- 【JAVA并发编程实战】3、同步容器
同步容器包括Vector和Hashtable,还有一些由Collections.synchronizedXxx等工厂方法创建的 1.同步容器类的问题 同步容器类都是线程安全的,但是有些时候还是要客户端 ...
- C# Async/Await
前言 前几天去一个公司面试,被问到 Async/Await,之前只知道有这么个东西,没有深入了解过就没有答上来.今天没啥事情,就查了下资料. 同步编程,异步编程概念 通常情况下,我们写的程 ...
- 对于SSH框架的选择
选择框架:SSH 对于Web开发来说,SSH框架可以提高开发效率,还可以方便需求的变更以及对后期维护方面更容易操作.SSH也是目前稍微流行的Web开发框架. 选择框架描述: 首先说明一下SSH并不是一 ...
- UML 用例图、顺序图、状态图、类图、包图、协作图、流程图
用例图.顺序图.状态图.类图.包图.协作图 面向对象的问题的处理的关键是建模问题.建模可以把在复杂世界的许多重要的细节给抽象出.许多建模工具封装了UML(也就是Unified Modeling La ...
- 基本排序算法——快速排序java实现
简单的快速排序算法,我竟然花费了如此多的时间来写作,好好学习. /** * */ package basic.sort; import java.util.Arrays; import java.ut ...
- Introduction to Microsoft Dynamics 365 licensing
Microsoft Dynamics 365 will be released on November 1. In preparation for that, Scott Guthrie hosted ...
- SharePoint 2013 配置Excel Services
前言:本文主要介绍如何启用SharePoint 2013版本Excel Services服务,并配置Excel Web Access部件,使Excel文档可以显示在Web页面中. 简单说一下流程,Sh ...
- AJAX初探,XMLHttpRequest介绍
AJAX初探,XMLHttpRequest介绍 AJAX AJAX = Asynchronous JavaScript and XML. 异步的JavaScript和XML. AJ ...
- Solr实现Low Level查询解析(QParser)
Solr实现Low Level查询解析(QParser) Solr基于Lucene提供了方便的查询解析和搜索服务器的功能,可以以插件的方式集成,非常容易的扩展我们自己需要的查询解析方式.其中,Solr ...