现在的位置: 首页 > 综合 > 正文

1047: [HAOI2007]理想的正方形

2018年04月24日 ⁄ 综合 ⁄ 共 1356字 ⁄ 字号 评论关闭
#include<iostream>//AC:t=1 w=0 WA:t=0 w=0
#include<cstdio>
using namespace std;
inline long long read(){    
    long long x=0,f=1;char ch=getchar();    
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}    
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}    
    return x*f;    
}  
long long n,m,k,ans=100000000000001LL,a[2001][2001],lmax[2001][2001],lmin[2001][2001],fmax[2001][2001],fmin[2001][2001],t,w;
pair<long long,int> q[2001];
long long Min(long long a,long long b){
	if(a<b)return a;
	else return b;
} 
int main(){
	n=read();m=read();k=read();
	if(k==0){printf("0");return 0;}
	if(k>max(n,m))k=max(n,m);
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			a[i][j]=read();
	for(int j=1;j<=m;j++){
		t=1;w=0;
		for(int i=1;i<=n;i++){
			while(t<=w&&a[i][j]>q[w].first)w--;
			q[++w]=make_pair(a[i][j],i);
			while(i-q[t].second>=k)t++;
			if(i>=k)lmax[i][j]=q[t].first;
		}
		t=1;w=0;
		for(int i=1;i<=n;i++){
			while(t<=w&&a[i][j]<q[w].first)w--;
			q[++w]=make_pair(a[i][j],i);
			while(i-q[t].second>=k)t++;
			if(i>=k)lmin[i][j]=q[t].first;
		}
	}
	for(int i=k;i<=n;i++){
		t=1;w=0;
		for(int j=1;j<=m;j++){
			while(t<=w&&lmax[i][j]>q[w].first)w--;
			q[++w]=make_pair(lmax[i][j],j);
			while(j-q[t].second>=k)t++;
			if(j>=k)fmax[i][j]=q[t].first;
		}
		t=1;w=0;
		for(int j=1;j<=m;j++){
			while(t<=w&&lmin[i][j]<q[w].first)w--;
			q[++w]=make_pair(lmin[i][j],j);
			while(j-q[t].second>=k)t++;
			if(j>=k)fmin[i][j]=q[t].first;
		}
	}
	for(int i=k;i<=n;i++)
		for(int j=k;j<=m;j++)
			ans=Min(ans,fmax[i][j]-fmin[i][j]);
	printf("%lld",ans);
	return 0;
} 

抱歉!评论已关闭.