【bzoj1047】理想的正方形
【bzoj1047】理想的正方形
题意
给定\(a*b\)由整数组成的矩形。
现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值
的差最小。
\(1\leq a,b\leq 1000\)
\(1\leq n\leq 100\)
分析
枚举每一个位置,然后考虑快速求矩形内的最大值和最小值即可。
单调队列可以快速实现:
先求出\(d[i][j]\)表示\(a[i][j-n+1,j-n,...,j]\)中的最值。
然后求出\(f[i][j]\)表示\(d[i-n+1,i-n,...,i][j]\)中的最值。
所有的\(f[i][j]\)就表示以\((i,j)\)为右下角端点的矩形的最值。
也可以使用ST表。
由于\(n\)一定,所以只需要用一个简化的二维ST表即可。
\(f[i][j][k]\)表示跨度为\(2^i\),终点在\((j,k)\)的矩形的最值。
注意ST表的正确姿势。
对于二维ST表,记\(f[i][j][k][l]\),其中两个跨度放前面。
不然调试起来会很麻烦的。
代码
#include <cstdio>
#include <cctype>
#include <cmath>
#include <climits>
#include <algorithm>
using namespace std;
#define rep(i,a,b) for (int i=(a);i<=(b);i++)
const int N=1001;
const int U=10;
const int MAX=INT_MAX>>1;
const int MIN=INT_MIN>>1;
int n,m,siz;
int a[N][N];
int un,um; int unit;
int maxV[U][N][N],minV[U][N][N];
int res;
int rd(void) {
int x=0,f=1; char c=getchar();
for (;!isdigit(c);c=getchar()) if (c=='-') f=-1;
for (;isdigit(c);c=getchar()) x=x*10+c-'0';
return x*f;
}
int Query(int x,int y) {
int tx=(x-siz+1)+(1<<unit)-1;
int ty=(y-siz+1)+(1<<unit)-1;
int mx=MIN;
mx=max(mx,maxV[unit][x][y]);
mx=max(mx,maxV[unit][x][ty]);
mx=max(mx,maxV[unit][tx][y]);
mx=max(mx,maxV[unit][tx][ty]);
int mn=MAX;
mn=min(mn,minV[unit][x][y]);
mn=min(mn,minV[unit][x][ty]);
mn=min(mn,minV[unit][tx][y]);
mn=min(mn,minV[unit][tx][ty]);
return mx-mn;
}
int main(void) {
#ifndef ONLINE_JUDGE
freopen("bzoj1047.in","r",stdin);
freopen("bzoj1047.out","w",stdout);
#endif
n=rd(),m=rd(),siz=rd();
rep(i,1,n) rep(j,1,m)
a[i][j]=rd();
unit=(int)(log(siz)/log(2));
rep(i,0,unit) rep(j,1,n) rep(k,1,m) {
minV[i][j][k]=MAX;
maxV[i][j][k]=MIN;
}
rep(j,1,n) rep(k,1,m) {
minV[0][j][k]=a[j][k];
maxV[0][j][k]=a[j][k];
}
rep(i,1,unit) rep(j,1,n) rep(k,1,m) {
int tj=max(1,j-(1<<(i-1)));
int tk=max(1,k-(1<<(i-1)));
int *now=&(minV[i][j][k]);
*now=min(*now,minV[i-1][j][k]);
*now=min(*now,minV[i-1][j][tk]);
*now=min(*now,minV[i-1][tj][k]);
*now=min(*now,minV[i-1][tj][tk]);
now=&(maxV[i][j][k]);
*now=max(*now,maxV[i-1][j][k]);
*now=max(*now,maxV[i-1][j][tk]);
*now=max(*now,maxV[i-1][tj][k]);
*now=max(*now,maxV[i-1][tj][tk]);
}
res=MAX;
rep(i,siz,n) rep(j,siz,m) {
int t=Query(i,j);
res=min(res,t);
}
printf("%d\n",res);
return 0;
}
【bzoj1047】理想的正方形的更多相关文章
- bzoj1047理想的正方形
题目链接 纪念又双叒叕的一道暴力碾标算的题 我们考虑纯暴力 #include<iostream> #include<cstdio> #include<algorithm& ...
- bzoj1047 理想的正方形
Description 有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. Input 第一行为3个整数,分别表示a,b,n的值第二行至第 ...
- 【BZOJ1047】[HAOI2007]理想的正方形(单调队列,动态规划)
[BZOJ1047][HAOI2007]理想的正方形(单调队列,动态规划) 题面 BZOJ 洛谷 题解 直接一个单调队列维护一下没给点和它前面的\(n\)个位置的最大值,再用一次单调队列维护连续\(n ...
- 【BZOJ1047】[HAOI2007]理想的正方形
[BZOJ1047][HAOI2007]理想的正方形 题面 bzoj 洛谷 题解 二维\(st\)表,代码是以前的 #include<iostream> #include<cstdi ...
- [bzoj1047][HAOI2007]理想的正方形_动态规划_单调队列
理想的正方形 bzoj-1047 HAOI-2007 题目大意:有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 注释:$2\le a, ...
- BZOJ1047: [HAOI2007]理想的正方形 [单调队列]
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 2857 Solved: 1560[Submit][St ...
- bzoj千题计划215:bzoj1047: [HAOI2007]理想的正方形
http://www.lydsy.com/JudgeOnline/problem.php?id=1047 先用单调队列求出每横着n个最大值 再在里面用单调队列求出每竖着n个的最大值 这样一个位置就代表 ...
- 【BZOJ1047】[HAOI2007]理想的正方形 (倍增ST表)
[HAOI2007]理想的正方形 题目描述 有一个\(a*b\)的整数组成的矩阵,现请你从中找出一个\(n*n\)的正方形区域,使得该区域所有数中的最大值和最小值的差最小. 输入输出格式 输入格式: ...
- HAOI2007 理想的正方形
1047: [HAOI2007]理想的正方形 Time Limit: 10 Sec Memory Limit: 162 MBSubmit: 1402 Solved: 738[Submit][Sta ...
随机推荐
- Linux下常用的shell命令记录1
硬件篇 CPU相关 lscpu #查看的是cpu的统计信息. cat /proc/cpuinfo #查看CPU信息详细信息,如每个CPU的型号,主频等 内存相关 free -m #概要查看内存情况 ...
- ubuntu安装StarDict星际译王
http://sixipiaoyang.blog.163.com/blog/static/6232358820144146386437/ 1,安装StarDict星际译王. 这是linux系统中最常用 ...
- VS2015使用技巧 为什么我们可以输入cw后按两下tab键出现console.writeline
镇场诗: 大梦谁觉,水月中建博客.百千磨难,才知世事无常. 今持佛语,技术无量愿学.愿尽所学,铸一良心博客.------------------------------------------ 为什么 ...
- BZOJ 2627 JZPKIL
题目链接:http://www.lydsy.com:808/JudgeOnline/problem.php?id=2627 题意:计算下面式子 思路: A先不管.我们来搞B部分.下面说如何计算B这个最 ...
- 摘抄--使用cos实现多个文件上传详解
在开发中常常需要上传文件,上传文件的方式有很多种,这里有一个cos实现的例子. 首先是要拷贝cos.jar包拷贝到WEB-INF/lib目录下,然后才进行编码. 创建一个可以进行自动重命名的Java文 ...
- UVA 11584 一 Partitioning by Palindromes
Partitioning by Palindromes Time Limit:1000MS Memory Limit:0KB 64bit IO Format:%lld & %l ...
- [翻译]观察变换View Transform (Direct3D 9)
这一节介绍在Direct3d中观察变换的基本概念和怎么去设置观察矩阵. 视口变换把观察者放在世界坐标系中,并把顶点转化到摄像机空间.在摄像机空间,摄像机或者说观察者在原点,观察方向为z轴正向.Dire ...
- Using SYSTEM.MOUSE_ITEM In Oracle Forms
If the mouse is in an item, SYSTEM.MOUSE_ITEM represents the name of that item as a CHAR value.For e ...
- [SAP ABAP开发技术总结]IDoc
声明:原创作品,转载时请注明文章来自SAP师太技术博客( 博/客/园www.cnblogs.com):www.cnblogs.com/jiangzhengjun,并以超链接形式标明文章原始出处,否则将 ...
- JS学习笔记(四) 正则表达式(RegExp对象)
参考资料: 1. http://www.w3school.com.cn/js/js_obj_regexp.asp ☂ 知识点: ☞ RegExp是正则表达式的缩写. ☞ RegExp是一种模式,用于在 ...