洛谷

说这是一道单调队列好题,但是我并不是用单调队列做的诶。

如果往最暴力的方向去想,肯定是\(n^3\)的\(dp\)了。

\(f[i][j][k]\)代表当前正方形的左上角定点是\((i,j)\),边长是\(k\)的正方形的最佳答案。

转移方程很简单,但是你一定会妥妥的\(\texttt{TLE}\)。

那么我们怎么做呢?

往倍增的方向去想,设\(f[i][j][k]\)表示左上角为\((i,j)\),边长为\(2^j\)的正方形的最佳答案。

那么状态就这么转移:

\[mx[i][j]=max(mx[i][j],max(mx[i+(1<<k)][j+(1<<k)],max(mx[i+(1<<k)][j],mx[i][j+(1<<k)])));
\]

\[mn[i][j]=min(mn[i][j],min(mn[i+(1<<k)][j+(1<<k)],min(mn[i+(1<<k)][j],mn[i][j+(1<<k)])));
\]

很简单的转移方程,不过复杂度肯定比不上单调队列的做法了。

显然复杂度\(O(n^2~log(n))\)。

代码:

#include <bits/stdc++.h>
using namespace std; const int N=1001;
int a,b,n,t[N][N];
int mx[N][N],mn[N][N],ans=2000000000,tmp; int main()
{
ios::sync_with_stdio(false);
cin>>a>>b>>n;
for (int i=0;i<a;++i)
for (int j=0;j<b;++j)
cin>>t[i][j],mn[i][j]=mx[i][j]=t[i][j];
while ((1<<(tmp+1))<=n) ++tmp;
for (int k=0;k<tmp;++k)
for (int i=0;i+(1<<k)<a;++i)
for (int j=0;j+(1<<k)<b;++j) {
mx[i][j]=max(mx[i][j],max(mx[i+(1<<k)][j+(1<<k)],max(mx[i+(1<<k)][j],mx[i][j+(1<<k)])));
mn[i][j]=min(mn[i][j],min(mn[i+(1<<k)][j+(1<<k)],min(mn[i+(1<<k)][j],mn[i][j+(1<<k)])));
}
for (int i=0;i<=a-n;++i)
for (int j=0;j<=b-n;++j) {
int MX=max(mx[i][j],max(mx[i+n-(1<<tmp)][j+n-(1<<tmp)],max(mx[i+n-(1<<tmp)][j],mx[i][j+n-(1<<tmp)])));
int MN=min(mn[i][j],min(mn[i+n-(1<<tmp)][j+n-(1<<tmp)],min(mn[i+n-(1<<tmp)][j],mn[i][j+n-(1<<tmp)])));
ans=min(MX-MN,ans);
}
cout<<ans;
return 0;
}

洛谷 P2216 [HAOI2007]理想正方形的更多相关文章

  1. 洛谷 P2216 [HAOI2007]理想的正方形

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

  2. 洛谷P2216: [HAOI2007]理想的正方形 单调队列优化DP

    洛谷P2216 )逼着自己写DP 题意: 给定一个带有数字的矩阵,找出一个大小为n*n的矩阵,这个矩阵中最大值减最小值最小. 思路: 先处理出每一行每个格子到前面n个格子中的最大值和最小值.然后对每一 ...

  3. 洛谷P2216 HAOI2007 理想的正方形 (单调队列)

    题目就是要求在n*m的矩形中找出一个k*k的正方形(理想正方形),使得这个正方形内最值之差最小(就是要维护最大值和最小值),显然我们可以用单调队列维护. 但是二维平面上单调队列怎么用? 我们先对行处理 ...

  4. 洛谷 P2216 [HAOI2007]理想的正方形 || 二维RMQ的单调队列

    题目 这个题的算法核心就是求出以i,j为左上角,边长为n的矩阵中最小值和最大值.最小和最大值的求法类似. 单调队列做法: 以最小值为例: q1[i][j]表示第i行上,从j列开始的n列的最小值.$q1 ...

  5. 【DP】【单调队列】洛谷 P2216 [HAOI2007]理想的正方形 题解

        算是单调队列的复习吧,不是很难 题目描述 有一个$a\times b$的整数组成的矩阵,现请你从中找出一个$n\times n$的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 ...

  6. [洛谷P2216][HAOI2007]理想的正方形

    题目大意:有一个$a\times b$的矩阵,求一个$n\times n$的矩阵,使该区域中的极差最小. 题解:二维$ST$表,每一个点试一下是不是左上角就行了 卡点:1.用了一份考试时候写的二维$S ...

  7. BZOJ1047或洛谷2216 [HAOI2007]理想的正方形

    BZOJ原题链接 洛谷原题链接 显然可以用数据结构或\(ST\)表或单调队列来维护最值. 这里采用单调队列来维护. 先用单调队列维护每一行的最大值和最小值,区间长为正方形长度. 再用单调队列维护之前维 ...

  8. 洛谷 2216 [HAOI2007]理想的正方形

    题目戳这里 一句话题意 给你一个a×b的矩形,求一个n×n的子矩阵,矩阵里面的最大值和最小值之差最小. Solution 这个题目许多大佬都是单调队列,但是我不是很会,只好用了比较傻逼的方法: 首先我 ...

  9. 洛谷P2216 理想的正方形(单调队列)

    洛谷P2216 理想的正方形 题目链接 思路: 直接暴力显然不可行,可以发现每一个矩形向右边扩展时是一列一列增加,于是可以想到单调队列,用数组来维护当前每列的最大值.因为行也有限制,所以还要用一个单调 ...

随机推荐

  1. [转]Windows 10 安装SVN 不显示状态图标--解决方法

    原文链接:https://www.cnblogs.com/lzpong/p/6187366.html --- auth:lzpong 升级win10以后,什么都正常,就是svn版本库图标不见了,图标的 ...

  2. 第一个EJB示例

    FirstEJB2.0.zip Eclipse + JBoss 5.1 Ejb3Example.zip Eclipse + JBoss 7.1 注意点: 1. jboss 增加用户: D:\DevPr ...

  3. linux上定时备份mysql数据库

    定时备份数据库 /usr/sbin/backupmysql timestamp=`date +"%Y-%m-%d-%H-%M-%S"` mysqldump -uroot -p'12 ...

  4. flink on yarn 用户代码获取keytab本地文件和principal的方法

    flink on yarn的情况下配置的keytab文件会根据每次yarn application 分配taskmanager的变化都是不一样的,在部分场景下用户代码也需要获得keytab文件在yar ...

  5. python学习之assert语句

    assert语句用于代码检测并报警. 语法 assert code... 例子 # -*- coding: utf-8 -*- # assert语句说明 a,b= 1,23 a == 2 assert ...

  6. Prerender Application Level Middleware - ASP.NET Core Middleware

    In the previous post Use Prerender to improve AngularJS SEO, I have explained different solutions at ...

  7. mybatis实现分页

    实现分页实质上就是截取查询结果,还是先贴代码,再来分析 下面是mapper.xml里面的配置 <select id="queryRoleByPage" resultMap=& ...

  8. easyui menu 添加hideItem/showItem 方法

    $.extend($.fn.menu.methods,{ showItem:function(jq,text){ return jq.each(function(){ var item = $(thi ...

  9. php 知乎爬虫

    http://blog.jobbole.com/88788/ https://github.com/owner888/phpspider 费了半天劲安装了redis,导出cookie,发现仍是缺失很多 ...

  10. 第二百二十四节,jQuery EasyUI,ComboGrid(数据表格下拉框)组件

    jQuery EasyUI,ComboGrid(数据表格下拉框)组件 学习要点: 1.加载方式 2.属性列表 3.方法列表 本节课重点了解 EasyUI 中 ComboGrid(数据表格下拉框)组件的 ...