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开头的形式 ...
随机推荐
- Java容器类List、ArrayList、Vector及map、HashTable、HashMap的区别与用法
Java容器类List.ArrayList.Vector及map.HashTable.HashMap的区别与用法 ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数 ...
- SimpleDateFormat的一些常用用法
/** SimpleDateFormat函数语法: G 年代标志符 y 年 M 月 d 日 h 时 在上午或下午 (1~12) H 时 在一天中 (0~23) m 分 s 秒 S 毫秒 E 星期 D ...
- 实验 六:分析linux内核创建一个新进程的过程
实验六:分析Linux内核创建一个新进程的过程 作者:王朝宪 <Linux内核分析>MOOC课程http://mooc.study.163.com/course/USTC-1000029 ...
- 暑假学习笔记(一)——初识Neo4j和APICloud入门
暑假学习笔记(一)--初识Neo4j和APICloud入门 20180719笔记 1.Neo4j 接了学姐的系统测试报告任务,感觉工作很繁重,但是自己却每天挥霍时光.9月份就要提交系统测试报告了,但是 ...
- mysql 存储过程中结尾分割符修改
mysql中修改命令结束符delimiter的用法:mysql中的delimiter会告诉MySQL解释器,命令的结束符是什么,默认情况下MySQL的命令是以分号(;)结束的.在遇到(;)时,MySQ ...
- 转帖 IBM要推POWER9,来了解一下POWER处理器的前世今生
https://blog.csdn.net/kwame211/article/details/76669555 先来说一下最新的POWER 9 在Hot Chips会议上首次提到的IBM Power ...
- [转]MySQL 数据库事务隔离级别
然后说说修改事务隔离级别的方法: 1. 全局修改,修改 mysql.ini 配置文件,在最后加上 1 #可选参数有:READ-UNCOMMITTED, READ-COMMITTED, REPEATAB ...
- C# Stopwatch获取循环中某操作的时间消耗
在C#中通常使用DateTime来表示当前时间,可以在一个操作的前后分别使用一个DateTime对象获取当前时间,再将两个DateTime对象相减获得时间差(TimeSpan对象),从而得到这个操作耗 ...
- vue 请求后台数据2(copy)
https://blog.csdn.net/vergilgeekopen/article/details/68954940 需要引用vue-resource 安装请参考https://github.c ...
- Delphi7如何实现让Tedit显示文字垂直居中(上下居中)
通过下面的组件,可以在输入文字的时候自动垂直居中 直接把下面代码保存到Unit1.pas即可------------------------------------------ unit Unit1; ...