Description

有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。

Input

第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。

Output

仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。

水平方向用单调队列扫一次得出所有1*n区域的最大值和最小值

竖直方向再用单调队列扫一次上一部记录的最大值和最小值得出所有n*n区域的最大值和最小值

时间复杂度O(n2)

#include<cstdio>
int a,b,n,v[][];
int mx1[][],mn1[][];
int mx2[][],mn2[][];
struct{
int q[],qt[];
int qs,qe;
void clear(){
qs=qe=;
}
void push(int x,int t){
while(qs<qe&&q[qe-]<=x)--qe;
qt[qe]=t;
q[qe++]=x;
}
void chk(int p){
while(qs<qe&&qt[qs]<=p)qs++;
}
int max(){
return q[qs];
}
}q1;
struct{
int q[],qt[];
int qs,qe;
void clear(){
qs=qe=;
}
void push(int x,int t){
while(qs<qe&&q[qe-]>=x)--qe;
qt[qe]=t;
q[qe++]=x;
}
void chk(int p){
while(qs<qe&&qt[qs]<=p)qs++;
}
int min(){
return q[qs];
}
}q2;
int main(){
scanf("%d%d%d",&a,&b,&n);
for(int i=;i<a;i++)
for(int j=;j<b;j++)scanf("%d",v[i]+j);
for(int i=;i<a;i++){
q1.clear();
q2.clear();
for(int j=;j<n;j++)q1.push(v[i][j],j),q2.push(v[i][j],j);
mx1[i][n-]=q1.max();
mn1[i][n-]=q2.min();
for(int j=n;j<b;j++){
q1.push(v[i][j],j);
q1.chk(j-n);
mx1[i][j]=q1.max();
q2.push(v[i][j],j);
q2.chk(j-n);
mn1[i][j]=q2.min();
}
}
for(int j=;j<b;j++){
q1.clear();
q2.clear();
for(int i=;i<n;i++)q1.push(mx1[i][j],i),q2.push(mn1[i][j],i);
mx2[n-][j]=q1.max();
mn2[n-][j]=q2.min();
for(int i=n;i<a;i++){
q1.push(mx1[i][j],i);
q1.chk(i-n);
mx2[i][j]=q1.max();
q2.push(mn1[i][j],i);
q2.chk(i-n);
mn2[i][j]=q2.min();
}
}
int minv=;
for(int i=n-;i<a;i++){
for(int j=n-;j<b;j++){
if(mx2[i][j]-mn2[i][j]<minv)minv=mx2[i][j]-mn2[i][j];
}
}
printf("%d",minv);
return ;
}

bzoj1047 理想的正方形的更多相关文章

  1. bzoj1047理想的正方形

    题目链接 纪念又双叒叕的一道暴力碾标算的题 我们考虑纯暴力 #include<iostream> #include<cstdio> #include<algorithm& ...

  2. 【bzoj1047】理想的正方形

    [bzoj1047]理想的正方形 题意 给定\(a*b\)由整数组成的矩形. 现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值 的差最小. \(1\leq a,b\leq 10 ...

  3. 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)

    [BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...

  4. 【BZOJ1047】[HAOI2007]理想的正方形

    [BZOJ1047][HAOI2007]理想的正方形 题面 bzoj 洛谷 题解 二维\(st\)表,代码是以前的 #include<iostream> #include<cstdi ...

  5. [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列

    理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...

  6. BZOJ1047: [HAOI2007]理想的正方形 [单调队列]

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 2857  Solved: 1560[Submit][St ...

  7. bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形

    http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...

  8. 【BZOJ1047】[HAOI2007]理想的正方形 (倍增ST表)

    [HAOI2007]理想的正方形 题目描述 有一个\(a*b\)的整数组成的矩阵,现请你从中找出一个\(n*n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: ...

  9. HAOI2007 理想的正方形

    1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec  Memory Limit: 162 MBSubmit: 1402  Solved: 738[Submit][Sta ...

随机推荐

  1. 关于双网卡双宽带Http及Socks代理的配置

    1.[硬件环境] a, 1台宿主(win7)+几十台虚拟机(xp)(vm10的版本,估计可打开52台以上的虚拟机) b, 双网卡,其中一个网卡通过路由连接电信ADSL,一个直连集线器,可直接连接移动m ...

  2. oracle多表查询之内连接,外连接语句总结

    后期会补充建表语句. 现有两张表,westemp员工表,有(wtdempid,wtdempname,wtddeptid)列,westdept部门表,有(wtddeptid,wtddeptname,wt ...

  3. Oracle top 查询TOP SQL

    有时Oracle数据库服务器,系统CPU爆高,通过Top命令可以查看到占用CPU最高的进程 我们需要记住前几个TOP的pid号,带入下面的SQL,到数据库中查询运行的进程.服务器.用户.SQL.等待等 ...

  4. postgresql的copy

    https://www.postgresql.org/docs/current/static/sql-copy.html 一.Copy的基本语法 Copy的作用是复制数据在数据表和文件之间. Copy ...

  5. 需求改进&系统设计

    1.需求&原型改进 针对课堂讨论环节老师和其他组的问题及建议,对修改选题及需求进行修改,发现在原有需求下,无需进行过大修改. 2.系统设计 3.Alpha任务分配计划 待定 4.测试计划 测试 ...

  6. 在junit中添加fail--有test失败即build Failed

    项目使用jenkins做持续集成,ant来构建,发现在跑junit单元测试的时候,如果有test case失败了,ci的状态是黄色的unstable,而不是红色的failed,看起来很不爽.个人觉得b ...

  7. DevExpress v17.2新版亮点—Analytics Dashboard篇(一)

    用户界面套包DevExpress v17.2日前终于正式发布,本站将以连载的形式为大家介绍各版本新增内容.本文将介绍了Analytics Dashboard v17.2 的新功能,快来下载试用新版本! ...

  8. [转]CentOS 6和CentOS 7防火墙的关闭

      CentOS6.5查看防火墙的状态: 1 [linuxidc@localhost ~]$service iptable status 显示结果: 1 2 3 4 5 [linuxidc@local ...

  9. c++下基于windows socket的单线程服务器客户端程序(基于TCP协议)

    今天自己编写了一个简单的c++服务器客户端程序,注释较详细,在此做个笔记. windows下socket编程的主要流程可概括如下:初始化ws2_32.dll动态库-->创建套接字-->绑定 ...

  10. PTA 大炮打蚊子   (15分)

    现在,我们用大炮来打蚊子:蚊子分布在一个M×NM\times NM×N格的二维平面上,每只蚊子占据一格.向该平面的任意位置发射炮弹,炮弹的杀伤范围如下示意: O OXO O 其中,X为炮弹落点中心,O ...