理想的正方形 HAOI2007(二维RMQ)
理想的正方形
省队选拔赛河南
有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。
第一行为3个整数,分别表示a,b,n的值
第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。
仅一个整数,为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
(1)矩阵中的所有数都不超过1,000,000,000
(2)20%的数据2<=a,b<=100,n<=a,n<=b,n<=10
(3)100%的数据2<=a,b<=1500,n<=a,n<=b,n<=100
/* 嗯,脑补二维RMQ fail,挂成暴力分。 一维是维护一个区间,二维是维护一个矩阵。 由于这个题是小正方形,三维数组即可。二维RMQ略麻烦... */ #include<iostream> #include<cstdio> #include<cstring> #include<cmath> #include<cstdlib>#define x2 x1+n-1-(1<<m)+1 #define y2 y1+n-1-(1<<m)+1using namespace std; void read(int &x) {int f=1;x=0;char c=getchar();while(!isdigit(c)){if(c=='-')f=-1;c=getchar();}while(isdigit(c)){x=(x<<3)+(x<<1)+c-'0';c=getchar();}x*=f; }void out(int x) {if(!x){putchar('0');return;}if(x<0){x=~x+1;putchar('-');}char c[30]= {0};while(x)c[++c[0]]=x%10+48,x/=10;while(c[0])putchar(c[c[0]--]); } const int inf=1e3+29; int i,j,k,m; int g[inf][inf][12]; int f[inf][inf][12]; int x,y,n; int ans=0x7fffffff;int query(int x1,int y1) {int maxn=0,minn=0x7fffffff;maxn=max(f[x1][y1][m],f[x2][y2][m]);maxn=max(maxn,f[x1][y2][m]);maxn=max(maxn,f[x2][y1][m]);minn=min(g[x1][y1][m],g[x2][y2][m]);minn=min(minn,g[x1][y2][m]);minn=min(minn,g[x2][y1][m]);return maxn-minn; }int main() {read(y);read(x);read(n);m=log(n)/log(2);for(i=1; i<=y; i++)for(j=1; j<=x; j++){read(f[j][i][0]);g[j][i][0]=f[j][i][0];}for(k=1; k<=12; k++)for(i=1; i+(1<<k)-1<=x; i++)for(j=1; j+(1<<k)-1<=y; j++){f[i][j][k]=max(f[i][j][k-1],f[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);f[i][j][k]=max(f[i][j][k],f[i+(1<<(k-1))][j][k-1]);f[i][j][k]=max(f[i][j][k],f[i][j+(1<<(k-1))][k-1]);g[i][j][k]=min(g[i][j][k-1],g[i+(1<<(k-1))][j+(1<<(k-1))][k-1]);g[i][j][k]=min(g[i][j][k],g[i+(1<<(k-1))][j][k-1]);g[i][j][k]=min(g[i][j][k],g[i][j+(1<<(k-1))][k-1]);}for(i=1; i+n-1<=x; i++)for(j=1; j+n-1<=y; j++)ans=min(ans,query(i,j));out(ans);return 0; }
转载于:https://www.cnblogs.com/L-Memory/p/7719132.html
理想的正方形 HAOI2007(二维RMQ)相关推荐
- P2216 [HAOI2007]理想的正方形(二维RMQ)
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...
- 【bzoj1047】[HAOI2007]理想的正方形 二维RMQ
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...
- P2601 [ZJOI2009]对称的正方形(二维哈希)(二分)
洛谷传送门 文章目录 题目描述 解析 代码 题目描述 解析 做三个hash 分一下正方形边长的奇偶性 然后枚举中心点,二分边长即可 有点类似模拟赛那道红十字的题 我一开始觉得分奇偶好麻烦啊 为什么不直 ...
- poj2019(二维RMQ)
题目连接:http://poj.org/problem?id=2019 只是增加一个维度,类比一维即可. 好理解,但是可以做的更好http://www.cnblogs.com/yijiull/p/67 ...
- 正方形个数(二维点哈希)
题目:http://poj.org/problem?id=2002 题意:平面上给定n个点,求由这些点能构成多少个正方形. 分析:我们枚举两个点,那么在这两个点形成的直线两边可以计算出正方形的另外两个 ...
- bzoj 1414 bzoj 3705: [ZJOI2009]对称的正方形(二维Hash)
1414: [ZJOI2009]对称的正方形 Time Limit: 10 Sec Memory Limit: 162 MB Submit: 727 Solved: 345 [Submit][St ...
- Codeforces713D(二维RMQ)
区间最大子正方形问题. 预处理后二分答案验证 AC Code: #include<bits/stdc++.h> #define maxn 1005 #define lim 10 using ...
- HDU2888(二维RMQ)
题目:Check Corners 本题碉堡了,内存限制好紧,再大一点都不行,还只能用int,开始用short WA了好多次..... 题意:给一个矩阵,然后给Q个询问,每个询问有四个数,分别代表询问的 ...
- POJ2019(二维RMQ问题 ST)
题目:Cornfields 只是注意本题数据定义小一点,不然会超内存. #include <stdio.h> #include <iostream> #include < ...
最新文章
- 在windows平台使用Apache James搭建邮件服务器以及使用C#向外网发送邮件
- 计算机视觉-计算机视觉开源库OpenCV基础
- java 8 新特性之日期-时间 API
- 斯坦佛编程教程-Unix编程工具(五)
- 数组的操作与方法的操作 0303 2101
- 集结号!四大国产开源数据库共聚申城,共话未来技术演进
- 算法工程师面试备战笔记7_数据清洗与特征处理
- java编程菜鸟入门01
- IDEA解决maven多module出现多root的问题
- 词形变换和词干提取工具(英文)
- jupyter notebook 多行输出
- 泛微E8调整附件大小和属性
- 20个你需要知道的JavaScript简写代码片段
- 【Excel】用excel生成矩阵
- 路由器、交换机的基本配置 1
- 建木(Jianmu)----迈出建木第一步创建项目分组
- situ课题组工作站神经网络训练速度测评
- Unity实战之牧师与魔鬼(动作分离版)
- Android录制屏幕视频 将视频转换为GIF动态图
- 阿里云服务器从购买到项目部署详细流程