记录编号 307556 评测结果 AAAAAAAAAA
题目名称 [HAOI 2007]理想的正方形 最终得分 100
用户昵称 Gravatar面对疾风吧 疾风 疾风吧 是否通过 通过
代码语言 C++ 运行时间 2.177 s
提交时间 2016-09-15 15:08:16 内存使用 9.77 MiB
显示代码纯文本
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<deque>
#define maxn 1020
using namespace std;
int n,m,k,ans,Max[maxn][maxn],Min[maxn][maxn],a[maxn][maxn],cnt;
int main(){
	freopen("square.in","r",stdin);freopen("square.out","w",stdout);
	scanf("%d%d%d",&n,&m,&k);ans=0x7f7f7f7f;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=m;j++)
			scanf("%d",&a[i][j]);
	for(int i=1;i<=n;i++){
		deque<int> q1,q2;cnt=0;
		for(int j=1;j<=m;j++){
			if(j<k){
				while(!q1.empty()&&a[i][ q1.back() ]<a[i][j])q1.pop_back();q1.push_back(j);
				while(!q2.empty()&&a[i][ q2.back() ]>a[i][j])q2.pop_back();q2.push_back(j);
				continue;
			}
			while(!q1.empty()&&q1.front()<=j-k)q1.pop_front();
			while(!q2.empty()&&q2.front()<=j-k)q2.pop_front();
			while(!q1.empty()&&a[i][ q1.back() ]<a[i][j])q1.pop_back();q1.push_back(j);
			while(!q2.empty()&&a[i][ q2.back() ]>a[i][j])q2.pop_back();q2.push_back(j);
			Max[i][ ++cnt ]=a[i][ q1.front() ];
			Min[i][cnt]=a[i][ q2.front() ]; 
		}
	}
	/*for(int i=1;i<=n;i++){
		for(int j=1;j<=cnt;j++){
			printf("%d ",Max[i][j]);
		}printf("\n");
	}
	for(int i=1;i<=n;i++){
		for(int j=1;j<=cnt;j++){
			printf("%d ",Min[i][j]);
		}printf("\n");
	}
	printf("====\n");*/
	for(int j=1;j<=cnt;j++){
		deque<int> q1,q2;
		for(int i=1;i<=n;i++){
			if(i<k){				
				while(!q1.empty()&&Max[ q1.back() ][j]<Max[i][j])q1.pop_back();q1.push_back(i);
				while(!q2.empty()&&Min[ q2.back() ][j]>Min[i][j])q2.pop_back();q2.push_back(i);
				continue;
			}
			while(!q1.empty()&&q1.front()<=i-k)q1.pop_front();
			while(!q2.empty()&&q2.front()<=i-k)q2.pop_front();
			while(!q1.empty()&&Max[ q1.back() ][j]<Max[i][j])q1.pop_back();q1.push_back(i);
			while(!q2.empty()&&Min[ q2.back() ][j]>Min[i][j])q2.pop_back();q2.push_back(i);
			ans=min(ans,Max[ q1.front() ][j]-Min[ q2.front() ][j]);
		}
	} 
	printf("%d\n",ans);
	fclose(stdin);fclose(stdout);
	//while(1);
	return 0;
}