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开头的形式 ...
随机推荐
- sonarqube扫描安卓代码
代码才用https://github.com/liwanlei/bilibili-android-client 配置: build.gralde配置 buildscript { repositorie ...
- SpringBoot日记——MQ消息队列整合(二)
基于第一篇文章搭建好环境以后,我们这篇文章继续介绍如何在springboot中使用RabbitMQ. 1).单播:添加好pom文件和自定义配置后,来看: @Autowired RabbitTempla ...
- Js_数组操作
用 js有很久了,但都没有深究过js的数组形式.偶尔用用也就是简单的string.split(char).这段时间做的一个项目,用到数组的地方很多,自以为js高手的自己居然无从下手,一下狠心,我学!呵 ...
- vector 简介
vector简介 vector是STL中最常见的容器,它是一种顺序容器,支持随机访问.vector是一块连续分配的内存,从数据安排的角度来讲,和数组极其相似, 不同的地方就是:数组是静态分配空间,一旦 ...
- 使用kubeadm安装kubernetes高可用集群
kubeadm安装kubernetes高可用集群搭建 第一步:首先搭建etcd集群 yum install -y etcd 配置文件 /etc/etcd/etcd.confETCD_NAME=inf ...
- PAT甲题题解-1021. Deepest Root (25)-dfs+并查集
dfs求最大层数并查集求连通个数 #include <iostream> #include <cstdio> #include <algorithm> #inclu ...
- sql not in 优化问题
问题情境: not in 耗时过长.想用join或exits代替.结果并不明显,这里先记录3种写法,以后探讨速度问题. sql语句: // not exists sql = @"select ...
- Alpha冲刺第4天
Alpha第四天 1.团队成员 郑西坤 031602542 (队长) 陈俊杰 031602504 陈顺兴 031602505 张胜男 031602540 廖钰萍 031602323 雷光游 03160 ...
- github建仓库注意
在导入新的项目工程时,github建仓库时不要选择readme文件初始化仓库
- JwtUtils 工具类
/** * jwt工具类 */ public class JwtUtils { public static final String SUBJECT = "onehee"; *** ...