bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形
http://www.lydsy.com/JudgeOnline/problem.php?id=1047
先用单调队列求出每横着n个最大值
再在里面用单调队列求出每竖着n个的最大值
这样一个位置就代表了一个n*n矩阵的最大值
同理求出最小值
- #include<cstdio>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define N 1001
- int num[N][N];
- int mx1[N][N],mx2[N][N];
- int mi1[N][N],mi2[N][N];
- int q[N],pos[N],h,t;
- void read(int &x)
- {
- x=; int f=; char c=getchar();
- while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
- while(isdigit(c)) { x=x*+c-''; c=getchar(); }
- x*=f;
- }
- int main()
- {
- #ifndef ONLINE_JUDGE
- freopen("data.in","r",stdin);
- freopen("xxy.out","w",stdout);
- #endif
- int a,b,n;
- read(a); read(b); read(n);
- for(int i=;i<=a;++i)
- for(int j=;j<=b;++j)
- read(num[i][j]);
- for(int i=;i<=a;++i)
- {
- h=t=;
- for(int j=;j<=b;++j)
- {
- while(h<t && j-pos[h]+>n) h++;
- while(h<t && num[i][j]>q[t-]) t--;
- q[t]=num[i][j];
- pos[t++]=j;
- if(j>=n) mx1[i][j]=q[h];
- }
- }
- for(int j=n;j<=b;++j)
- {
- h=t=;
- for(int i=;i<=a;++i)
- {
- while(h<t && i-pos[h]+>n) h++;
- while(h<t && mx1[i][j]>q[t-]) t--;
- q[t]=mx1[i][j];
- pos[t++]=i;
- if(i>=n) mx2[i][j]=q[h];
- }
- }
- for(int i=;i<=a;++i)
- {
- h=t=;
- for(int j=;j<=b;++j)
- {
- while(h<t && j-pos[h]+>n) h++;
- while(h<t && num[i][j]<q[t-]) t--;
- q[t]=num[i][j];
- pos[t++]=j;
- if(j>=n) mi1[i][j]=q[h];
- }
- }
- for(int j=n;j<=b;++j)
- {
- h=t=;
- for(int i=;i<=a;++i)
- {
- while(h<t && i-pos[h]+>n) h++;
- while(h<t && mi1[i][j]<q[t-]) t--;
- q[t]=mi1[i][j];
- pos[t++]=i;
- if(i>=n) mi2[i][j]=q[h];
- }
- }
- int ans=2e9;
- for(int i=n;i<=a;++i)
- for(int j=n;j<=b;++j)
- ans=min(ans,mx2[i][j]-mi2[i][j]);
- printf("%d",ans);
- }
AC
- #include<cstdio>
- #include<iostream>
- #include<algorithm>
- using namespace std;
- #define N 1001
- int num[N][N];
- int mx[N][N];
- int mi[N][N];
- int q[N],pos[N],h,t;
- void read(int &x)
- {
- x=; int f=; char c=getchar();
- while(!isdigit(c)) { if(c=='-') f=-; c=getchar(); }
- while(isdigit(c)) { x=x*+c-''; c=getchar(); }
- x*=f;
- }
- int main()
- {
- freopen("data.in","r",stdin);
- freopen("std.out","w",stdout);
- int a,b,n;
- read(a); read(b); read(n);
- for(int i=;i<=a;++i)
- for(int j=;j<=b;++j)
- read(num[i][j]);
- int ans=1e9;
- for(int i=;i+n-<=a;++i)
- for(int j=;j+n-<=b;++j)
- {
- int I=i+n-;
- int J=j+n-;
- int p=1e9,q=-1e9;
- for(int k=i;k<=I;++k)
- for(int l=j;l<=J;++l)
- p=min(p,num[k][l]),q=max(q,num[k][l]);
- ans=min(ans,q-p);
- }
- printf("%d",ans);
- }
force
- #include<cmath>
- #include<cstdlib>
- #include<cstdio>
- #include<ctime>
- using namespace std;
- int main()
- {
- freopen("data.in","w",stdout);
- srand(time()+);
- int a=,b=;
- int n=rand()%+;
- printf("%d %d %d\n",a,b,n);
- for(int i=;i<=a;++i)
- {
- for(int j=;j<=b;++j) printf("%d ",rand());
- printf("\n");
- }
- }
maker
1047: [HAOI2007]理想的正方形
Time Limit: 10 Sec Memory Limit: 162 MB
Submit: 3791 Solved: 2095
[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<=1000
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
bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形的更多相关文章
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- bzoj千题计划300:bzoj4823: [Cqoi2017]老C的方块
http://www.lydsy.com/JudgeOnline/problem.php?id=4823 讨厌的形状就是四联通图 且左右各连一个方块 那么破坏所有满足条件的四联通就好了 按上图方式染色 ...
- [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列
理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...
- bzoj千题计划186:bzoj1048: [HAOI2007]分割矩阵
http://www.lydsy.com/JudgeOnline/problem.php?id=1048 #include<cmath> #include<cstdio> #i ...
- bzoj千题计划296:bzoj1053: [HAOI2007]反素数ant
http://www.lydsy.com/JudgeOnline/problem.php?id=1053 求n以内约数个数最多的数 #include<cstdio> using names ...
- bzoj千题计划196:bzoj4826: [Hnoi2017]影魔
http://www.lydsy.com/JudgeOnline/problem.php?id=4826 吐槽一下bzoj这道题的排版是真丑... 我还是粘洛谷的题面吧... 提供p1的攻击力:i,j ...
- bzoj千题计划280:bzoj4592: [Shoi2015]脑洞治疗仪
http://www.lydsy.com/JudgeOnline/problem.php?id=4592 注意操作1 先挖再补,就是补的范围可以包含挖的范围 SHOI2015 的题 略水啊(逃) #i ...
- bzoj千题计划177:bzoj1858: [Scoi2010]序列操作
http://www.lydsy.com/JudgeOnline/problem.php?id=1858 2018 自己写的第1题,一遍过 ^_^ 元旦快乐 #include<cstdio> ...
- bzoj千题计划317:bzoj4650: [Noi2016]优秀的拆分(后缀数组+差分)
https://www.lydsy.com/JudgeOnline/problem.php?id=4650 如果能够预处理出 suf[i] 以i结尾的形式为AA的子串个数 pre[i] 以i开头的形式 ...
随机推荐
- Unity关于方法事件生命周期官方文档
http://docs.unity3d.com/Manual/ExecutionOrder.html 一.组件运行的基本顺序 下图中创建类的顺序为A,B,C,A1,二运行的结果为A1,B,C,A. 可 ...
- bower配置私服nexus3
内容来自 https://help.sonatype.com/repomanager3/bower-repositories#BowerRepositories-BrowsingBowerReposi ...
- 关于OBS获取显示器黑屏的解决办法
近来看到许多人说OBS获取显示器源的时候黑屏,下面介绍下相关处理办法. 第一种,先尝试把OBS程序的兼容性设置成Win 7和管理员身份,具体操作: 设置成这样,如果能够获取到显示器,那么问题解决,否则 ...
- 腾讯 深圳 25928-PHP开发工程师(深圳)
工作地点:深圳 职位类别:技术类 招聘人数:1人 工作职责: 负责游戏研运体系流程工具及相关产品的开发.维护: 参与支撑系统的需求分析.设计.编码: 承担外包开发成员技术导师,解决技术难点,把控开发质 ...
- 在ubuntu下运行python脚本
转自http://www.cnblogs.com/hester/p/5575658.html 1. 运行方式一 新建test.py文件: 1 touch test.py 然后vim test.py打开 ...
- d3 数学方法(伪随机数生成器 )
一.正态(高斯)分布(normal (Gaussian) distribution)的随机数 /* var nomarlRandmo = d3.random.normal(); console.log ...
- webpack打包使用
md创建文件夹 dir是遍历 如何安装node环境 首先下载安装包;安装好以后 使用cmd命令 建立一个新的文件夹(一定是英文的),然后cmd 命令中 cd 进入所安装的盘的地址. 在该文件夹下面 使 ...
- ci test
下载ci 版本 3.1.9 下载地址 https://www.codeigniter.com/ 怎么查看CI的版本信息?想看某个项目中使用的CI具体是哪个版本,怎么查看?system\core\cod ...
- sessionStorage & string typeof
sessionStorage & string typeof
- MT【109】线面角最大时为二面角平面角
解答:如图设C到$\alpha$面的距离为$d_1,C_1$到虚线距离为$d_2$ 所求距离$d=d_1+d_2=|AC|sin\theta+|CC_1|cos\theta=4\sqrt{2}sin\ ...