【bzoj1047】[HAOI2007]理想的正方形 二维RMQ
题目描述
有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
输入
第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。
100%的数据2<=a,b<=1000,n<=a,n<=b,n<=1000
输出
仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。
样例输入
5 4 2
1 2 5 6
0 17 16 0
16 17 2 1
2 10 2 1
1 2 2 2
样例输出
1
题解
二维RMQ
说RMQ过不去的站出来。。。我打肿他的脸。。。
由于查询区域是个正方形,因此我们不用对两维分别倍增,而是一起倍增,令$mx/mn[i][j][k]$表示从$(i,j)$向右下的$2^k*2^k$的区域内的最大/最小值。
预处理方法与一维RMQ一样,只不过变成4个更新1个。。。
然后就没有然后了。。。
时间复杂度$O(ab\log n)$。
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 1010
using namespace std;
int v[N][N] , mx[11][N][N] , mn[11][N][N] , k;
int main()
{int a , b , n , i , j , ans = 1 << 30 , maxn , minn;scanf("%d%d%d" , &a , &b , &n);for(i = 1 ; i <= a ; i ++ )for(j = 1 ; j <= b ; j ++ )scanf("%d" , &v[i][j]) , mx[0][i][j] = mn[0][i][j] = v[i][j];for(k = 1 ; (1 << k) <= n ; k ++ )for(i = 1 ; i <= a - (1 << k) + 1 ; i ++ )for(j = 1 ; j <= b - (1 << k) + 1 ; j ++ )mx[k][i][j] = max(max(mx[k - 1][i][j] , mx[k - 1][i][j + (1 << (k - 1))]) , max(mx[k - 1][i + (1 << (k - 1))][j] , mx[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))])), mn[k][i][j] = min(min(mn[k - 1][i][j] , mn[k - 1][i][j + (1 << (k - 1))]) , min(mn[k - 1][i + (1 << (k - 1))][j] , mn[k - 1][i + (1 << (k - 1))][j + (1 << (k - 1))]));k -- ;for(i = 1 ; i <= a - n + 1 ; i ++ )for(j = 1 ; j <= b - n + 1 ; j ++ )maxn = max(max(mx[k][i][j] , mx[k][i][j + n - (1 << k)]) , max(mx[k][i + n - (1 << k)][j] , mx[k][i + n - (1 << k)][j + n - (1 << k)])), minn = min(min(mn[k][i][j] , mn[k][i][j + n - (1 << k)]) , min(mn[k][i + n - (1 << k)][j] , mn[k][i + n - (1 << k)][j + n - (1 << k)])), ans = min(ans , maxn - minn);printf("%d\n" , ans);return 0;
}
转载于:https://www.cnblogs.com/GXZlegend/p/7491533.html
【bzoj1047】[HAOI2007]理想的正方形 二维RMQ相关推荐
- P2216 [HAOI2007]理想的正方形 ( 二维ST表 )
题目链接:点击进入 题目 思路 maxx [ i ] [ j ] :左上角坐标 ( i , j ) ,边长为 2 k 2^k 2k 的正方形的最大值 minn [ i ] [ j ] :左上角坐标 ( ...
- bzoj1047 [HAOI2007]理想的正方形 单调队列
这种在矩形里面找矩形有固定的套路,不是容斥就是左右上下延伸,这个题就是向左向右延伸.. 然后手玩优化发现邻位转移比暴力要好一些,可以用splay统计,但复杂度不对 然后由于每一行互不影响于是可以单行同 ...
- 理想的正方形 HAOI2007(二维RMQ)
理想的正方形 省队选拔赛河南 时间限制: 1 s 空间限制: 256000 KB 题目等级 : 大师 Master 题目描述 Description 有一个a*b的整数组成的矩阵,现 ...
- P2216 [HAOI2007]理想的正方形(二维RMQ)
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...
- P2216 [HAOI2007]理想的正方形
P2216 [HAOI2007]理想的正方形 题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. a,b<=1000 分析 ...
- [HAOI2007] 理想的正方形
洛谷题目链接:[HAOI2007]理想的正方形 题目描述 有一个ab的整数组成的矩阵,现请你从中找出一个nn的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行 ...
- bzoj 1047: [HAOI2007]理想的正方形
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 3324 Solved: 1828 [Submit][ ...
- 小程序生成二维码,正方形二维码,跟小程序码
data:{ qrimg: " ", showCodeImg:true, } wx.request({ url: app.globalData.siteurlh5 +'/api/a ...
- luogu P2216 [HAOI2007]理想的正方形 递推+ST表
题意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 数据规模: (1)矩阵中的所有数都不超过1,000,000,000 (2)20% ...
最新文章
- LeetCode简单题之生成每种字符都是奇数个的字符串
- python粘性拓展_Python基础之:拓展解决问题的思路
- cent os 6 fdisk fat32
- 2018年区块链技术发展总结与展望(附报告全文) | 起风研究院
- 《Head First Python》第四章--持久存储
- 【渝粤题库】国家开放大学2021春3924★汽车电器设备构造与检修题目
- pyqt5 自定义控件_PyQt5学习笔记(十六)Pyinstaller打包与SQLite数据库
- Spark Streaming源码分析 – DStream
- 微课|中学生可以这样学Python(8.4节):递归算法例题讲解1
- 遥感动态监测实验(以福州为例)
- 无缓冲I/O与有缓冲I/O区别
- centos7网络配置总结
- 怎么做一个企业级的BI项目?三步教你迅速搭建
- 《计算机网络教程》(微课版 第五版) 第二章 物理层 课后习题及答案
- Python 实现王者荣耀自动刷金币
- 【Web】HTML(No.06)表格标签经典案例《小说排行榜》
- CSRF, XSS攻击
- CVPR 2018 论文解读(部分)
- http中的scheme和小程序中的scheme
- B站声音太小怎么办,一款插件帮你解决
热门文章
- 将代码部署到 GitHub Pages 的快速简易方法
- idou老师教你学istio:监控能力介绍
- 一些大厂的css reset 代码
- JDK/Java SE官方文档汇总
- 在两个不同域中的WINDOWS 2003活动目录做迁移笔记
- 路由 RIP 协议 和 滞空路由
- json:JSONObject包的具体使用(JSONObject-lib包是一个beans,collections,maps,java arrays和xml和JSON互相转换的包)...
- Linux系统管理第六周作业【Linux微职位】
- Spring 基础概念——DI、IOC(一)
- 工作那些事儿(8)- 废旧立新