理想的正方形 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)+1 using namespace std;
void read(int &x)
{
int f=;x=;char c=getchar();
while(!isdigit(c)){if(c=='-')f=-;c=getchar();}
while(isdigit(c)){x=(x<<)+(x<<)+c-'';c=getchar();}
x*=f;
} void out(int x)
{
if(!x){putchar('');return;}
if(x<){x=~x+;putchar('-');}
char c[]= {};
while(x)c[++c[]]=x%+,x/=;
while(c[])putchar(c[c[]--]);
}
const int inf=1e3+;
int i,j,k,m;
int g[inf][inf][];
int f[inf][inf][];
int x,y,n;
int ans=0x7fffffff; int query(int x1,int y1)
{
int maxn=,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();
for(i=; i<=y; i++)
for(j=; j<=x; j++)
{
read(f[j][i][]);
g[j][i][]=f[j][i][];
}
for(k=; k<=; k++)
for(i=; i+(<<k)-<=x; i++)
for(j=; j+(<<k)-<=y; j++)
{
f[i][j][k]=max(f[i][j][k-],f[i+(<<(k-))][j+(<<(k-))][k-]);
f[i][j][k]=max(f[i][j][k],f[i+(<<(k-))][j][k-]);
f[i][j][k]=max(f[i][j][k],f[i][j+(<<(k-))][k-]);
g[i][j][k]=min(g[i][j][k-],g[i+(<<(k-))][j+(<<(k-))][k-]);
g[i][j][k]=min(g[i][j][k],g[i+(<<(k-))][j][k-]);
g[i][j][k]=min(g[i][j][k],g[i][j+(<<(k-))][k-]);
}
for(i=; i+n-<=x; i++)
for(j=; j+n-<=y; j++)
ans=min(ans,query(i,j));
out(ans);
return ;
}
理想的正方形 HAOI2007(二维RMQ)的更多相关文章
- 【洛谷2216】[HAOI2007] 理想的正方形(二维RMQ)
点此看题面 大致题意: 求出一个矩阵中所有\(n*n\)正方形中极差的最小值. 另一种做法 听说这题可以用单调队列去做,但是我写了一个二维\(RMQ\). 二维\(RMQ\) \(RMQ\)相信大家都 ...
- P2216 [HAOI2007]理想的正方形(二维RMQ)
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...
- [HAOI2007]理想的正方形 BZOJ1047 二维RMQ
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: 第一行为3个整数,分别表示a,b,n的值 第二行至 ...
- 【洛谷 P2216】 [HAOI2007]理想的正方形(二维ST表)
题目链接 做出二维\(ST\)表,然后\(O(n^2)\)扫一遍就好了. #include <cstdio> #include <cstring> #include <a ...
- [luoguP2216] [HAOI2007]理想的正方形(二维单调队列)
传送门 1.先弄个单调队列求出每一行的区间为n的最大值最小值. 2.然后再搞个单调队列求1所求出的结果的区间为n的最大值最小值 3.最后扫一遍就行 懒得画图,自己体会吧. ——代码 #include ...
- 【bzoj1047】[HAOI2007]理想的正方形 二维RMQ
题目描述 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入 第一行为3个整数,分别表示a,b,n的值第二行至第a+1行每行为b个非 ...
- 【LightOJ 1081】Square Queries(二维RMQ降维)
Little Tommy is playing a game. The game is played on a 2D N x N grid. There is an integer in each c ...
- hdu2888 二维RMQ
Check Corners Time Limit: 2000/10000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others) T ...
- hduacm 2888 ----二维rmq
http://acm.hdu.edu.cn/showproblem.php?pid=2888 模板题 直接用二维rmq 读入数据时比较坑爹 cin 会超时 #include <cstdio& ...
随机推荐
- 管理Cookie和Session
管理Cookie和Session 前言 这几天中,一直再跟漏洞打交道,而在这些漏洞中,出现的最多的就是 Cookie 和 Session 了.这篇文章就简单的介绍一些 Cookie 中最常用的四个属性 ...
- Codeforces Gym100495 B、D、E、F、K
http://codeforces.com/gym/100495 K题 草地的面积减去相交的面积,计算几何,垃圾题,避免不必要的计算损失精度(能约分的约分) 卡了老子一个星期了 再加前几天的一道题 这 ...
- UVA 140_Bandwidth
题意: 定义一个结点的带宽是其距离所有相连结点的最远距离,一个图的带宽是图中所有结点带宽的最小值.给出一个图中各个结点的相邻情况,要求写出一个结点的排列,使得其所构成的图带宽最小. 分析: 枚举全排列 ...
- codevs——1031 质数环
1031 质数环 时间限制: 1 s 空间限制: 128000 KB 题目等级 : 黄金 Gold 题解 查看运行结果 题目描述 Description 一个大小为N(N<=17 ...
- 洛谷 P2064 奇妙的汽车
P2064 奇妙的汽车 题目描述 你有着一辆奇妙的汽车,这辆汽车有着自动加速的功能.打个比方吧,第1天你驾驶着它可以行驶a路程,那么第2天你可以让它所走的路程增加到第1天的2~9倍(必须是其中一个整数 ...
- SHARP AR-2048D/2348D
http://www.sharp.cn/printer/AR-2048D%7C2348D/support/download.html
- MongoDB小结25 - 复合唯一索引
只要满足索引的其中之一不同即可 db.blog.ensureIndex({"username":1,"blogname":1}) 作者和作品名其中之一不同即可创 ...
- 1076. Forwards on Weibo (30)【树+搜索】——PAT (Advanced Level) Practise
题目信息 1076. Forwards on Weibo (30) 时间限制3000 ms 内存限制65536 kB 代码长度限制16000 B Weibo is known as the Chine ...
- HDU 1796 How many integers can you find(容斥原理+二进制/DFS)
How many integers can you find Time Limit: 12000/5000 MS (Java/Others) Memory Limit: 65536/32768 ...
- 鼠标滚轮插件jQuery mousewheel
delta的值是负的即-1,那么滚轮就是向下滚动.正的1就是向上. 插件方法: 1.为了监听滚轮事件,该插件引入了mousewheel事件.所以我们能够监听元素的mousewheel事件 2.该插件还 ...