记录编号 174283 评测结果 AAAAAAAAAA
题目名称 [HAOI 2007]理想的正方形 最终得分 100
用户昵称 Gravatar神利·代目 是否通过 通过
代码语言 C++ 运行时间 1.062 s
提交时间 2015-07-31 21:07:40 内存使用 9.62 MiB
显示代码纯文本
#include<cstdio>
using namespace std;
//////////////////////////////////////////
int temp;
char c;
inline int in()
{
	temp=0;c=getchar();
	while(c<48||c>57)
		c=getchar();
	for(;c>=48&&c<=57;c=getchar())
		temp=temp*10+c-48;
	return temp;
}
/////////////////////////////////////////
struct queue
{
    int id,w;
}qmax[1111],qmin[1111];
int la=1,ra,li=1,ri,a,b,n,o,ans=0x7fffffff,min[1001][1001],max[1001][1001];
int main()
{
	freopen("square.in","r",stdin);
	freopen("square.out","w",stdout);
    a=in();b=in();n=in();
    for(int i=1;i<=a;++i)
    {    
        for(int j=1;j<=b;++j)
        {    
            o=in();
            if(li>ri)
            {
                qmin[++ri].id=j;
                qmin[ri].w=o;
            }
            if(la>ra)
            {
                qmax[++ra].id=j;
                qmax[ra].w=o;
            }
            while(li<=ri&&qmin[ri].w>o)
                --ri;
            qmin[++ri].w=o;
            qmin[ri].id=j;
            while(la<=ra&&qmax[ra].w<o)
                --ra;
            qmax[++ra].w=o;
            qmax[ra].id=j;
            if(j>=n)
            {
                while(qmin[li].id<=j-n)
                    ++li;
                min[i][j]=qmin[li].w;
                while(qmax[la].id<=j-n)
                    ++la;
                max[i][j]=qmax[la].w;
            }
        }
        la=1;ra=0;li=1;ri=0;
    }
    for(int j=n;j<=b;++j)
    {    
        for(int i=1;i<=a;++i)
        {
            if(la>ra)
            {
                qmax[++ra].id=i;
                qmax[ra].w=max[i][j];
            }
            if(li>ri)
            {
                qmin[++ri].id=i;
                qmin[ri].w=min[i][j];
            }
            while(la<=ra&&qmax[ra].w<max[i][j])
                --ra;
            qmax[++ra].w=max[i][j];
            qmax[ra].id=i;
            while(li<=ri&&qmin[ri].w>min[i][j])
                --ri;
            qmin[++ri].w=min[i][j];
            qmin[ri].id=i;
            if(i>=n)
            {
                while(qmax[la].id<=i-n)
                    ++la;
                while(qmin[li].id<=i-n)
                    ++li;
                if(ans>qmax[la].w-qmin[li].w)
                    ans=qmax[la].w-qmin[li].w;
            }
        }
        la=1;ra=0;li=1;ri=0;
    }
    printf("%d",ans);
    //while(1);
}