题目链接

纪念又双叒叕的一道暴力碾标算的题
我们考虑纯暴力
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a,b,n;
int map[][];
int ans=0x3f3f3f3f;
int main()
{
scanf("%d%d%d",&a,&b,&n);
for(int i=;i<=a;i++)
for(int j=;j<=b;j++)
scanf("%d",&map[i][j]);
for(int i=;i+n-<=a;i++)
for(int j=;j+n-<=b;j++){
int maxx=,minn=0x3f3f3f3f;
for(int l=i;l<=n+i-;l++)
for(int r=j;r<=n+j-;r++)
maxx=max(maxx,map[l][r]),
minn=min(minn,map[l][r]);
ans=min(ans,maxx-minn);
}
printf("%d",ans);
return ;
}
然后显然,果断$TLE$
那么我们考虑怎么优化暴力
别跟我提什么数据结构啊,单调队列
本小可爱一个也不会
我们回头看看这两道题 洛谷P2038洛谷P2280
这两道题也是矩阵,然后我们是用的维护二维前缀和来找的在一个矩形内的某些数值
那么,这道题是不是也可以类似的做呢?
由于询问的都是正方形,
我们可以预处理出来
所有正方形的最大最小值
($ps:$从$(1,1)$开始计数)
定义$maxx[i][j][k]$表示以$(i,j)$为左上端点,然后边长为$k$的正方形最大值,$minn[i][j][k]$表示最小。
通过类比上两道题,还有画图,得出
$$maxx[i][j][k]=max(max(maxx[i][j][k-1],maxx[i+1][j+1][k-1]),max(maxx[i][j+1][k-1],maxx[i+1][j][k-1]))$$
$$minn[i][j][k]=min(min(minn[i][j][k-1],minn[i+1][j+1][k-1]),min(minn[i][j+1][k-1],minn[i+1][j][k-1]))$$
所以,我们可以求出来$maxx[][][n],minn[][][n]$
然后枚举左上角端点然后更新答案就行

别以为这样就好了
您写完了之后本地编译了么?
是不是编译未成功?
因为$maxx,minn$这样要开$1001*1001*1001=1e9$辣么大的数组
显然开不下啊$qwq$
那怎么办?
凉拌啊!
发现我们推$maxx,minn$的时候,每次只涉及到$k,k-1$,并且只涉及到$i+1,j+1,i,j$这几个东东,所以可以类似滚动数组优化,滚掉$k$这一维
然后又是省选题
开个$O2$也没什么大不了的
其实是本宝宝懒得写优化了
上代码:
看,连$1kb$都不到
真是暴力碾标算的好题啊$qwq$
// luogu-judger-enable-o2
#pragma GCC optimize (2)
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a,b,n;
int map[][];
int maxx[][];
int minn[][];
int ans=0x3f3f3f3f;
int main()
{
scanf("%d%d%d",&a,&b,&n);
for(int i=;i<=a;i++)
for(int j=;j<=b;j++)
scanf("%d",&map[i][j]),
maxx[i][j]=minn[i][j]=map[i][j];
for(int k=;k<=n;k++)
for(int i=;i+k<=a+;i++)
for(int j=;j+k<=b+;j++)
maxx[i][j]=max(max(maxx[i][j],maxx[i+][j+]),max(maxx[i][j+],maxx[i+][j])),
minn[i][j]=min(min(minn[i][j],minn[i+][j+]),min(minn[i][j+],minn[i+][j])),
ans=k==n?min(ans,maxx[i][j]-minn[i][j]):0x3f3f3f3f;
printf("%d",ans);
return ;
}
/*
5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2
*/

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

  1. bzoj1047 理想的正方形

    Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. Input 第一行为3个整数,分别表示a,b,n的值第二行至第 ...

  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. 8 MySQL--单表查询

    单表查询: http://www.cnblogs.com/linhaifeng/articles/7267592.html 1.单表查询的语法 2.关键字的执行优先级(重点) 3.简单查询 4.whe ...

  2. role是一个HTML5的属性

    <form role="form"> role是一个HTML5的属性,role="form"告诉辅助设备(如屏幕阅读器)这个元素所扮演的角色是个表单 ...

  3. 使用opencv3+python实现视频运动目标检测

    本文主要实现了伯乐在线上的一个实践小项目,原文链接,用以巩固opencv视频操作知识内容.整个项目均有代码注释,通俗易懂,短短几十行就可以达到还算不错的实现效果,做起来成就感满满哒.打开编辑器,一起来 ...

  4. JDK8新特性:函数式接口@FunctionalInterface的使用说明

    我们常用的一些接口Callable.Runnable.Comparator等在JDK8中都添加了@FunctionalInterface注解. 通过JDK8源码javadoc,可以知道这个注解有以下特 ...

  5. DataGuard的cascading standby(1拖N的模式)

    在Oracle11.2.0.2版本后,dataguard支持级联模式传输日志,即日志传输可以从A到B,B到C,B到D,等等,无穷无尽 cascading standby可以分担主库传输日志到多个备库的 ...

  6. DNS BIND之rndc介绍及使用

    rndc(Remote Name Domain Controllerr)是一个远程管理bind的工具,通过这个工具可以在本地或者远程了解当前服务器的运行状况,也可以对服务器进行关闭.重载.刷新缓存.增 ...

  7. boost之内存管理

    内存管理一直是令C++程序员最头疼的工作,C++继承了C那高效而又灵活的指针,使用起来稍微不小心就会导致内存泄露.野指针.越界访问等访问.虽然C++标准提供了只能指针std::auto_ptr,但是并 ...

  8. Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容

    Android 禁止屏幕旋转 & 旋转屏幕时保持Activity内容   1.在应用中固定屏幕方向.        在AndroidManifest.xml的activity中加入:     ...

  9. .NET基础 (18)特性

    特性1 什么是特性,如何自定义一个特性2 .NET中特性可以在哪些元素上使用3 有哪几种方法可以获知一个元素是否申明某个特性4 一个元素是否可以重复申明同一个特性 特性1 什么是特性,如何自定义一个特 ...

  10. 组队作业_One

    Part 1.前言 结对项目作业 结对同学高裕翔的博客 本博文pdf版本 Part 2.PSP表 PSP3.1 Personal Software Process Stages 预估耗时(分钟) 实际 ...