题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1047

题目虽然有一个n的限制,但求二维区间最值首先想到的还是RMQ,但是如果按照往常RMQ的写法,空间复杂度是O(n2*(log2(n)2)),而且需要两个求最大最小,所以会爆空间,大概也会T,233。

所以这个时候发现n还是蛮重要的,dp[i][j]表示以点(i,j)为左上角,(i+(1<<(log2(n)-1)),j+(1<<(log2(n)-1)))为右下角的矩形区域内的最值。

如果不好理解可以在开一维k,即dp[i][j][k]表示以点(i,j)为左上角,(i+(1<<(k-1)),j+(1<<(k-1)))为右下角的矩形区域最值。

这样预处理之后枚举左上角,可以做到O(1)查询区间最值。

 #include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = ;
const int inf = 2e9;
int dpM[maxn][maxn];
int dpm[maxn][maxn];
int logk;
int query(int x, int y, int k) {
int w = k - ( << logk);
int Max = max(max(dpM[x][y], dpM[x + w][y + w]), max(dpM[x + w][y], dpM[x][y + w]));
int Min = min(min(dpm[x][y], dpm[x + w][y + w]), min(dpm[x + w][y], dpm[x][y + w]));
return Max - Min;
}
int main() {
int n, m, k, x;
scanf("%d%d%d", &n, &m, &k);
for (int i = ; i <= n; ++i)
for (int j = ; j <= m; ++j) {
scanf("%d", &x);
dpM[i][j] = dpm[i][j] = x;
}
logk = log2(k);
for (int t = ; t < logk; t++) {
for (int i = ; i + ( << t) <= n; i++) {
for (int j = ; j + ( << t) <= m; j++) {
dpM[i][j] = max(max(dpM[i][j], dpM[i + ( << t)][j + ( << t)]), max(dpM[i + ( << t)][j], dpM[i][j + ( << t)]));
dpm[i][j] = min(min(dpm[i][j], dpm[i + ( << t)][j + ( << t)]), min(dpm[i + ( << t)][j], dpm[i][j + ( << t)]));
}
}
}
int ans = inf;
for (int i = ; i <= n - k+; i++) {
for (int j = ; j <= m - k+; j++) {
ans = min(ans, query(i, j, k));
//cout << query(i, j, k) << " ";
}
}
printf("%d\n", ans);
}

[Bzoj1047][HAOI2007]理想的正方形(ST表)的更多相关文章

  1. [HAOI2007]理想的正方形 st表 || 单调队列

    ~~~题面~~~ 题解: 因为数据范围不大,而且题目要求的是正方形,所以这道题有2种解法. 1,st表. 这种解法暴力好写好理解,但是较慢.我们设st[i][j][k]表示以(i, j)为左端点,向下 ...

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

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

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

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

  4. BZOJ1047[HAOI2007]理想的正方形——二维ST表

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

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

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

  6. [luogu2216 HAOI2007] 理想的正方形 (2dST表 or 单调队列)

    题目描述 有一个ab的整数组成的矩阵,现请你从中找出一个nn的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至第a ...

  7. BZOJ1047: [HAOI2007]理想的正方形

    传送门 蛤省省选果然水啊,我这种蒟蒻都能一遍A. 横向纵向维护两个单调队列,做两次求最大和最小的,总复杂度$O(NM)$ 码农题,考察代码实现能力 //BZOJ 1047 //by Cydiater ...

  8. [BZOJ1047][HAOI2007]理想的正方形(RMQ+DP)

    题意 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 思路 RMQ求 再DP 代码 #include<cstdio> #i ...

  9. 【单调队列】bzoj1047 [HAOI2007]理想的正方形

    先把整个矩阵处理成b[n][m-K+1].c[n][m-K+1]大小的两个矩阵,分别存储每行每K个数中的最大.最小值,然后再通过b.c处理出d.e分别表示K*K大小的子矩阵中的最大.最小值即可.单调队 ...

随机推荐

  1. 身为一个小白,看到一篇值得看的文章。讲述小白学习python的6个方法。

    01. Python怎么学?   Python虽然号称非常简单,功能强大!但是再简单,它也是一门编程语言,任何一个编程语言都会包含: 内功,心法和招式,内功心法就是指的算法,数据结构: 招式就是任何一 ...

  2. Vue 实现文件的下载

    上次说了,实现文件的上传需要三步,那么实现文件的下载呢? 答:也是三步 第一步:获取文件的 fileId (或者别的什么的,总之应该是代表这个文件的东西),各家后台需要的都不一样 第二步:调用接口 t ...

  3. 微信小程序点击保存图片到相册

    wxml部分的代码   <view class="footer-r" bindtap="save"> <image src="../ ...

  4. layui在当前页面弹出一个iframe层,并改变这个iframe层里的一些内容

    layer.open({ type: 2, title: "专家信息", area: ['100%', '100%'], content: '/ZhuanJiaKu/AddZhua ...

  5. $mona$要成为高端玩家

    \(mona\)要成为高端玩家! 好在撑过了联赛,接下来要向高端玩家冲击啦! 新时期当然要有新的学习规划啦! 最近的更新(有什么就在这里说啦) 随便更更. \(FFT\)刷着打算先看看生成函数. 感觉 ...

  6. Java类加载器初识

    类加载器基本概念 类加载器(class loader)用来加载 Java 类到 Java 虚拟机中.一般来说,Java虚拟机使用Java类的方式如下:Java 源程序(.java 文件)在经过 Jav ...

  7. 远程连接Linux相关操作

    1.远程连接的步骤 编译网卡配置文件,修改onboot参数 vi /etc/sysconfig/network-scripts/ifcfg-ens33进入命令之后将onboot改成onboot=yes ...

  8. hdu 6050: Funny Function (2017 多校第二场 1006) 【找规律】

    题目链接 暴力打个表找下规律就好了,比赛时看出规律来了倒是,然而看这道题看得太晚了,而且高中的那些数列相关的技巧生疏了好多,然后推公式就比较慢..其实还是自身菜啊.. 公式是 #include< ...

  9. java单双引号转义问题

    JavaScript代码:var str = '<a href="javascript:;" onclick="visaDetail(\'1\',' + value ...

  10. SLF4J: The requested version 1.6 by your slf4j binding is not compatible with [1.5.5, 1.5.6]

    SLF4J:你的SLF4J绑定请求的1.6版不兼容[1.5.5,1.5.6] 在lib中,此时slf4j的版本是1.5.6,而slf4j-log4j的版本是1.6.由于版本的不兼容性,导致了这个错误. ...