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

5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2

Sample Output

1

竟然1A了
区间最大值和最小值,想到单调队列
考虑降维,把一列上n个数压成一个数,然后一行一行做
也就是先竖着每一列用单调队列分别处理mx[i][j]为(i,j)向上n个中最大的,mn[i][j]同理
然后一行一行处理f[j]此行j往前n个中mx最大值,g是mn最小值
对于能够成矩形的更新ans就行了
PS:注意初始值问题
  1. #include <iostream>
  2. #include <cstdio>
  3. #include <cstring>
  4. #include <algorithm>
  5. #include <cmath>
  6. using namespace std;
  7. const int N=,INF=2e9+;
  8. inline int read(){
  9. char c=getchar();int x=,f=;
  10. while(c<''||c>''){if(c=='-')f=-;c=getchar();}
  11. while(c>=''&&c<=''){x=x*+c-'';c=getchar();}
  12. return x*f;
  13. }
  14. int n,m,k,a[N][N];
  15. int mx[N][N],mn[N][N];
  16. int q[N],head=,tail=;
  17. void handle(int c){//printf("handle %d\n",c);
  18. head=;tail=;
  19. for(int i=;i<=n;i++){
  20. while(head<=tail&&q[head]<=i-k) head++;
  21. while(head<=tail&&a[i][c]>a[q[tail]][c]) tail--;
  22. q[++tail]=i;
  23. mx[i][c]=max(mx[i][c],a[q[head]][c]);
  24. }
  25.  
  26. head=;tail=;
  27. for(int i=;i<=n;i++){
  28. while(head<=tail&&q[head]<=i-k) head++;//if(c==1)printf("head %d %d\n",head,q[head]);
  29. while(head<=tail&&a[i][c]<a[q[tail]][c]) tail--;
  30. q[++tail]=i;//if(c==1)printf("tail %d %d\n",tail,q[tail]);
  31. 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]);
  32. }
  33. }
  34. int f[N],g[N],ans=INF;
  35. void sol(int r){
  36. head=;tail=;
  37. memset(f,,sizeof(f));
  38. for(int j=;j<=m;j++){
  39. while(head<=tail&&q[head]<=j-k) head++;
  40. while(head<=tail&&mx[r][j]>mx[r][q[tail]]) tail--;
  41. q[++tail]=j;
  42. f[j]=max(f[j],mx[r][q[head]]);
  43. }
  44.  
  45. head=;tail=;
  46. memset(g,,sizeof(g));
  47. for(int j=;j<=m;j++){
  48. while(head<=tail&&q[head]<=j-k) head++;
  49. while(head<=tail&&mn[r][j]<mn[r][q[tail]]) tail--;
  50. q[++tail]=j;
  51. g[j]=min(g[j],mn[r][q[head]]);
  52. }
  53.  
  54. 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]);
  55. }
  56. int main(){
  57. n=read();m=read();k=read();
  58. for(int i=;i<=n;i++)
  59. for(int j=;j<=m;j++){
  60. a[i][j]=read();
  61. }
  62.  
  63. memset(mn,,sizeof(mn));
  64. for(int j=;j<=m;j++) handle(j);
  65. for(int i=k;i<=n;i++) sol(i);
  66. printf("%d",ans);
  67.  
  68. // cout<<"test\n";
  69. // for(int i=1;i<=n;i++)
  70. // for(int j=1;j<=m;j++) printf("%d %d %d %d\n",i,j,mx[i][j],mn[i][j]);
  71. }

BZOJ1047: [HAOI2007]理想的正方形 [单调队列]的更多相关文章

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

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

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

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

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

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

  4. bzoj1047/luogu2216 理想的正方形 (单调队列)

    开b组单调队列,分别维护此时某一列中的最大/最小值 然后我每次把它们的头取出来,塞到维护行的单调队列里,就是n*n的最大/最小值 #include<bits/stdc++.h> #defi ...

  5. Luogu 2216[HAOI2007]理想的正方形 - 单调队列

    Solution 二维单调队列, 这个数组套起来看得我眼瞎... Code #include<cstdio> #include<algorithm> #include<c ...

  6. BZOJ 1047: [HAOI2007]理想的正方形 单调队列瞎搞

    题意很简明吧? 枚举的矩形下边界和右端点即右下角,来确定矩形位置: 每一个纵列开一个单调队列,记录从 i-n+1 行到 i 行每列的最大值和最小值,矩形下边界向下推移的时候维护一下: 然后在记录的每一 ...

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

    题目链接 Solution MD,经过这道题,算是掌握单调队列了... 可以先预处理出点 \((i,j)\) 往上 \(n\) 的最大值和最小值. 然后再横着做一遍单调队列即可. Code #incl ...

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

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

  9. [HAOI2007]理想的正方形 单调队列 暴力

    Code: #include<cstdio> #include<queue> #include<algorithm> using namespace std; #d ...

随机推荐

  1. 【转】c#获取网页地址参数

    假设当前页完整地址为:http://www.jbxue.com/aaa/bbb.aspx?id=5&name=kelli则: "http://"是协议名"www. ...

  2. 【JAVA并发编程实战】11、有界缓存的实现

    1.有界缓存的基类 package cn.xf.cp.ch14; /** * *功能:有界缓存实现基类 *时间:下午2:20:00 *文件:BaseBoundedBuffer.java *@autho ...

  3. MongoDB基础入门002--基本操作,增删改查

    一.这里只是演示最基本的操作,更多的信息可以去官网.https://docs.mongodb.com/manual 打开一个cmd,输入mongo命令打开shell,其实这个shell就是mongod ...

  4. [翻译]Apache Spark入门简介

    原文地址:http://blog.jobbole.com/?p=89446 我是在2013年底第一次听说Spark,当时我对Scala很感兴趣,而Spark就是使用Scala编写的.一段时间之后,我做 ...

  5. js监听input是第几次click

    我很多问题啊 真的是,然后我有问题就博问啊 ,博问的东西我还是放到博客里面来吧 因为我不怎么看博问 博客的话经常看, 恩 都是一开始我不懂 然后园友来解答的 真的很感谢这些园友 不多说 上代码吧 其实 ...

  6. 功能强大的滚动播放插件JQ-Slide

    查看效果:http://keleyi.com/keleyi/phtml/jqplug/4.htmJQ-Slide插件功能强大,滚动方式自由多样全部滚动方式 方式一 方式二 方式三 方式四 方式五 方式 ...

  7. 纯CSS打造好看的按钮样式

    好看的按钮.链接.div样式,效果预览: http://hovertree.com/code/run/css/s8o19792.html 发现今天积分和排名不错: 代码如下: <!DOCTYPE ...

  8. 使用React制作一个可配置的页面生成器[0]

    背景 上班两年多,终于来到一家互联网公司,告别之前的朝九晚六的腐败生活,开始了11116的码农之旅. 因为公司做的是直播相关的业务,所以伴随着直播,不定期的就会有运营活动-.- 但是这类活动留给码农的 ...

  9. 事务隔离级别(IsolationLevel)

    事务的特性(ACID)1.原子性(Atomicity) 事物是数据库的逻辑工作单位,事务中的诸多操作要么全做要么全不做2.一致性(Consistency) 事务执行结果必须是使数据库从一个一致性状态变 ...

  10. 对CVE-2014-6271 [破壳漏洞] 的一次不太深入的跟踪

    @firtst:有些事,该你遇到的始终会遇到!2013年,Struts2远程代码执行漏洞闹的满城风雨时,当时还对此一无所知:2014年4月,HeartBleed掀起波涛汹涌时,较快对此予以关注,晚上跑 ...