P2216 [HAOI2007]理想的正方形

Posted alex-leaves

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了P2216 [HAOI2007]理想的正方形相关的知识,希望对你有一定的参考价值。

 

题目描述

有一个a*b的整数组成的矩阵,现请你从中找出一个n*n的正方形区域,使得该区域所有数中的最大值和最小值的差最小。

输入输出格式

输入格式:

第一行为3个整数,分别表示a,b,n的值

第二行至第a+1行每行为b个非负整数,表示矩阵中相应位置上的数。每行相邻两数之间用一空格分隔。

 

输出格式:

仅一个整数,为a*b矩阵中所有“n*n正方形区域中的最大整数和最小整数的差值”的最小值。

 

输入输出样例

输入样例#1: 复制
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)矩阵中的所有数都不超过1,000,000,000

(2)20%的数据2<=a,b<=100,n<=a,n<=b,n<=10

(3)100%的数据2<=a,b<=1000,n<=a,n<=b,n<=100

 

很不错的一道题,然而我只会用二维ST表做……(太弱了)

注意i+1<<5不是表示i+(1<<5),而是(i+1)<<5,害得我第一次只有10分(话说竟然有分???excuse me???)

因为正方形,我们设f[i][j][k]表示以(i,j)为左上角的长度为2^k的极值。

他可以看成长度为4个2^(k-1)正方形组成的,所以转移方程很简单,而且mn(记录最小值)的数组不用初始化(想想,为什么?)

答案时枚举左上角即可,利用RMQ的思想就行了……

AC代码如下:

 

#include<cstdio>
#include<algorithm>
#include<cmath>
using namespace std;
const int N=1000+5;
const int M=10+5;
int mn[N][N][M],mx[N][N][M],n,a,b,x,ans=1<<30,m;
void init()
{
    for(int k=1;k<=11;k++)
    for(int i=1;i+(1<<k)-1<=a;i++)
    for(int j=1;j+(1<<k)-1<=b;j++) 
    mx[i][j][k]=max(max(mx[i][j][k-1],mx[i+(1<<(k-1))][j+(1<<(k-1))][k-1]),max(mx[i+(1<<(k-1))][j][k-1],mx[i][j+(1<<(k-1))][k-1])),
    mn[i][j][k]=min(min(mn[i][j][k-1],mn[i+(1<<(k-1))][j+(1<<(k-1))][k-1]),min(mn[i+(1<<(k-1))][j][k-1],mn[i][j+(1<<(k-1))][k-1]));
    return;
}
int q(int x1,int y1)
{
    int x2=x1+n-(1<<m),y2=y1+n-(1<<m);
    return max(max(mx[x1][y1][m],mx[x2][y2][m]),max(mx[x1][y2][m],mx[x2][y1][m]))-min(min(mn[x1][y1][m],mn[x2][y2][m]),min(mn[x2][y1][m],mn[x1][y2][m]));
}
int main()
{
    scanf("%d%d%d",&a,&b,&n);
    m=log(n)/log(2);
    for(int i=1;i<=a;i++)
    for(int j=1;j<=b;j++)
    scanf("%d",&x),mn[i][j][0]=mx[i][j][0]=x;
    init();
    for(int i=1;i+n-1<=a;i++)
    for(int j=1;j+n-1<=b;j++)
    ans=min(ans,q(i,j));
    printf("%d",ans);
    return 0;
}

以上是关于P2216 [HAOI2007]理想的正方形的主要内容,如果未能解决你的问题,请参考以下文章

P2216 [HAOI2007]理想的正方形

P2216 [HAOI2007]理想的正方形

P2216 [HAOI2007]理想的正方形

P2216 [HAOI2007]理想的正方形

洛谷P2216 [HAOI2007] 理想的正方形

luogu P2216 [HAOI2007]理想的正方形