【HAOI2007】理想的正方形
【问题描述】
有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
【输入】
第一行为3个整数,分别表示a,b,n的值
第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。
【输出】
仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。
【分析】
单调队列,先处理横行,再处理竖行。
#include <cstdlib>
#include <iostream>
#include <cmath>
#include <cstdio>
#include <cstring>
const int MAX=;
const int INF=0x7fffffff;
using namespace std;
//注意Max与Min(i,j)代表第i行从
int data[MAX][MAX],Max[MAX][MAX],Min[MAX][MAX];
int a,b,n,ans=INF; void init();//输入数据
void solve();
void prepare(int hang);
void work(int lie); int main()
{
//文件操作
freopen("square.in","r",stdin);
freopen("square.out","w",stdout);
init();//输入数据
solve();//求解
return ;
}
void init()
{
scanf("%d%d%d",&a,&b,&n);
for (int i=;i<=a;i++)
for (int j=;j<=b;j++)
scanf("%d",&data[i][j]);
}
void solve()
{
//计算出每行各个元素的最大值与最小值
for (int i=;i<=a;i++) prepare(i);//横推行
// printf("\n");
for (int i=n;i<=b;i++) work(i);//纵推列
printf("%d\n",ans);
}
void prepare(int hang)
{
int Q_MAX[MAX],front_MAX=,rear_MAX=;
int Q_MIN[MAX],front_MIN=,rear_MIN=;
for (int i=;i<=n;i++)//预处理
{
while (front_MAX<rear_MAX && data[hang][Q_MAX[rear_MAX]]<data[hang][i]) rear_MAX--;
Q_MAX[++rear_MAX]=i;
while (front_MIN<rear_MIN && data[hang][Q_MIN[rear_MIN]]>data[hang][i]) rear_MIN--;
Q_MIN[++rear_MIN]=i;
}
//开始计算,千万要注意边界问题
for (int i=n;i<=b;i++)
{
//先计算MAX与MIN值
while (front_MAX<rear_MAX && Q_MAX[front_MAX+]<(i-n+)) front_MAX++;
Max[hang][i]=data[hang][Q_MAX[front_MAX+]];
while (front_MIN<rear_MIN && Q_MIN[front_MIN+]<(i-n+)) front_MIN++;
Min[hang][i]=data[hang][Q_MIN[front_MIN+]];
//再考虑加入队列
while (front_MAX<rear_MAX && data[hang][Q_MAX[rear_MAX]]<data[hang][i+]) rear_MAX--;
Q_MAX[++rear_MAX]=i+;
while (front_MIN<rear_MIN && data[hang][Q_MIN[rear_MIN]]>data[hang][i+]) rear_MIN--;
Q_MIN[++rear_MIN]=i+;
}
//打印
//for (int i=n;i<=b;i++) printf("(%d %d) ",Max[hang][i],Min[hang][i]);
// printf("\n");
}
void work(int lie)
{
//printf("%d:",lie);
int Q_MAX[MAX],front_MAX=,rear_MAX=;
int Q_MIN[MAX],front_MIN=,rear_MIN=;
for (int i=;i<=n;i++)//预处理,注意这里换成行了
{
while (front_MAX<rear_MAX && Max[Q_MAX[rear_MAX-]][lie]<Max[i][lie]) rear_MAX--;
Q_MAX[rear_MAX++]=i;
while (front_MIN<rear_MIN && Min[Q_MIN[rear_MIN-]][lie]>Min[i][lie]) rear_MIN--;
Q_MIN[rear_MIN++]=i;
}
//开始计算,千万要注意边界问题
for (int i=n;i<=a;i++)
{
while (front_MAX<rear_MAX && Q_MAX[front_MAX]<(i-n+)) front_MAX++;
while (front_MIN<rear_MIN && Q_MIN[front_MIN]<(i-n+)) front_MIN++;
ans=min(ans,Max[Q_MAX[front_MAX]][lie]-Min[Q_MIN[front_MIN]][lie]); //printf("(%d %d) ",Q_MAX[front_MAX],Q_MIN[front_MIN]);
//再考虑加入队列
while (front_MAX<rear_MAX && Max[Q_MAX[rear_MAX-]][lie]<Max[i+][lie]) rear_MAX--;
Q_MAX[rear_MAX++]=i+;
while (front_MIN<rear_MIN && Min[Q_MIN[rear_MIN-]][lie]>Min[i+][lie]) rear_MIN--;
Q_MIN[rear_MIN++]=i+;
}
//printf("\n");
}
【HAOI2007】理想的正方形的更多相关文章
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- HAOI2007 理想的正方形
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1402 Solved: 738[Submit][Sta ...
- RAM——[HAOI2007]理想的正方形
题目:[HAOI2007]理想的正方形 描述: [问题描述] 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. [输入]: 第一行为3个 ...
- bzoj 1047 : [HAOI2007]理想的正方形 单调队列dp
题目链接 1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2369 Solved: 1266[Submi ...
- BZOJ 1047: [HAOI2007]理想的正方形( 单调队列 )
单调队列..先对每一行扫一次维护以每个点(x, y)为结尾的长度为n的最大最小值.然后再对每一列扫一次, 在之前的基础上维护(x, y)为结尾的长度为n的最大最小值. 时间复杂度O(ab) (话说还是 ...
- 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)
[BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...
- bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...
- 【BZOJ1047】[HAOI2007]理想的正方形
[BZOJ1047][HAOI2007]理想的正方形 题面 bzoj 洛谷 题解 二维\(st\)表,代码是以前的 #include<iostream> #include<cstdi ...
- 【BZOJ1047】[HAOI2007]理想的正方形 (倍增ST表)
[HAOI2007]理想的正方形 题目描述 有一个\(a*b\)的整数组成的矩阵,现请你从中找出一个\(n*n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: ...
- AC日记——[HAOI2007]理想的正方形 P2216
[HAOI2007] 理想的正方形 思路: 正解多个单调队列: 但是我用树套树水了过去: 来,上代码: #include <cstdio> #include <cstring> ...
随机推荐
- Linux 配置多IP
这里以红帽Linux为例.假定原系统已配置一个IP,地址为:192.168.20.140,配置文件路径/etc/sysconfig/network-script/ifcfg-eth0.现在需要配置一个 ...
- 日志式文件系统:SGI的xfs, Reiserfs, IBM的jfs, ext3fs
日志文件(Log files)是包含系统消息的文件,包括内核.服务.在系统上运行的应用程序等.不同的日志文件记载不同的信息.日志文件系统比传统的文件系统安全,因为它用独立的日志文件跟踪磁盘内容的变化. ...
- Shredding Company(dfs)
Time Limit: 1000MS Memory Limit: 10000K Total Submissions: 3519 Accepted: 2009 Description You h ...
- -_-#【工具】图片导出PDF
- Apache-Tika解析HTML文档
通常在使用爬虫时,爬取到网上的文章都是各式各样的格式处理起来比较麻烦,这里我们使用Apache-Tika来处理HTML格式的文章,如下: package com.mengyao.tika.app; i ...
- awr报告
BEGIN DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT();END;/ exec DBMS_WORKLOAD_REPOSITORY.CREATE_SNAPSHOT ...
- 一起学android之怎样获取手机程序列表以及程序相关信息并启动指定程序 (26)
效果图: 程序列表: watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQvaGFpX3FpbmdfeHVfa29uZw==/font/5a6L5L2T/fonts ...
- ARC简介以及工程中ARC与非ARC的混合
Piosa 博客园 博问 闪存 首页 新随笔 联系 管理 订阅 随笔- 79 文章- 0 评论- 13 ARC简介以及工程中ARC与非ARC的混合 ARC与非ARC在一个项目中同时使用, ...
- [转] nginx+FastCGI+c++
from: http://www.cnblogs.com/xiaouisme/archive/2012/08/01/2618398.html 一 安装 目的:不需支持php等.就html就行了.步骤: ...
- 精准化测试专业平台Paw:苹果APP应用代码质量的守护者
众所周知,一款苹果APP进入苹果应用商店后,要上排行榜,要被首页推荐,版本更新必不可少,但作为版本更新的关键所在,软件测试一直被业内吐槽“坑太多”,缺陷防不胜防.相关经验缺乏等等.若问如何“填坑”?以 ...