记录编号 82977 评测结果 AAAAAAAAAA
题目名称 [HAOI 2007]理想的正方形 最终得分 100
用户昵称 Gravatarranto 是否通过 通过
代码语言 C++ 运行时间 7.277 s
提交时间 2013-11-28 20:11:42 内存使用 3.28 MiB
显示代码纯文本
#include <fstream>
#include <list>

using namespace std;

ifstream in("square.in");
ofstream out("square.out");

struct node 
{
	long num;
	int posi;
};

class mqueue
{
private:
	list<node> nlist;
	long lenth;
public:
	typedef list<node>::iterator iterator;
	typedef node type;
	void set(long _lenth){lenth=_lenth;}
	void pushmax(node n);
	void pushmin(node n);
	mqueue::iterator max(long p);
	mqueue::iterator min(long p);
	void clear() {nlist.clear();}
};

node make(long num, long posi)
{
	node ret;
	ret.num=num;
	ret.posi=posi;
	return ret;
}

void mqueue::pushmax(node n)
{
	list<node>::reverse_iterator it(nlist.rbegin());
	while(it!=nlist.rend())
	{
		if(it->num<=(n.num))
		{
			nlist.pop_back();
			it=nlist.rbegin();
			continue;
		}
		break;
	}
	nlist.push_back(n);
	return ;
}

void mqueue::pushmin(node n)
{
	list<node>::reverse_iterator it(nlist.rbegin());
	while(it!=nlist.rend())
	{
		if(it->num>=(n.num))
		{
			nlist.pop_back();
			it=nlist.rbegin();
			continue;
		}
		break;
	}
	nlist.push_back(n);
	return ;
}

mqueue::iterator mqueue::max(long p)
{
	list<node>::iterator it(nlist.begin());
	while(p-(it->posi)>=lenth)
	{
		nlist.pop_front();
		it=nlist.begin();
	}
	return it;
}
	
mqueue::iterator mqueue::min(long p)
{
	list<node>::iterator it(nlist.begin());
	while(p-(it->posi)>=lenth)
	{
		nlist.pop_front();
		it=nlist.begin();
	}
	return it;
}

int a,b,n;
long **f;
long **maxn;
long **minn;
mqueue maxl;
mqueue minl;

void input();
void proc();
void output();

int main()
{
	input();
	proc();
	output();
	return 0;
}

void input()
{
	in>>a>>b>>n;
	maxl.set(n);
	minl.set(n);
	f=new long* [a];
	for(int i=0;i!=a;++i)
	{
		f[i]=new long [b];
		for(int j=0;j!=b;++j)
		{
			in>>f[i][j];
		}
	}
	return ;
}

void proc()
{
	maxn=new long* [a];
	minn=new long* [a];
	for(int i=0;i!=a;++i)
	{
		maxn[i]=new long [b-n+1];
		minn[i]=new long [b-n+1];
	}
	for(int i=0;i!=a;++i)
	{
		int j(0);
		for(;j!=n;++j)
		{
			maxl.pushmax(make(f[i][j], j));
			minl.pushmin(make(f[i][j], j));
		}
		maxn[i][0]=maxl.max(n-1)->num;
		minn[i][0]=minl.min(n-1)->num;
		for(;j!=b;++j)
		{
			maxl.pushmax(make(f[i][j], j));
			minl.pushmin(make(f[i][j], j));
			maxn[i][j-n+1]=maxl.max(j)->num;
			minn[i][j-n+1]=minl.min(j)->num;
		}
		maxl.clear();
		minl.clear();
	}
	/*for(int i=0;i!=a;++i)
	{
		for(int j=0;j!=b-n+1;++j)
		{
			out<<maxn[i][j]<<' ';
		}
		out<<endl;
	}
	for(int i=0;i!=a;++i)
	{
		for(int j=0;j!=b-n+1;++j)
		{
			out<<minn[i][j]<<' ';
		}
		out<<endl;
	}*/
	for(int k=0;k<b-n+1;++k)
	{
		int j(0);
		for(;j!=n;++j)
		{
			maxl.pushmax(make(maxn[j][k], j));
			minl.pushmin(make(minn[j][k], j));
		}
		maxn[0][k]=maxl.max(n-1)->num;
		minn[0][k]=minl.min(n-1)->num;
		for(;j!=a;++j)
		{
			maxl.pushmax(make(maxn[j][k], j));
			minl.pushmin(make(minn[j][k], j));
			maxn[j-n+1][k]=maxl.max(j)->num;
			minn[j-n+1][k]=minl.min(j)->num;
		}
		maxl.clear();
		minl.clear();
	}
	return ;
}

void output()
{
	long res(1<<30);
	for(int i=0;i!=a-n+1;++i)
	{
		for(int j=0;j!=b-n+1;++j)
		{
			register long ltemp(maxn[i][j]-minn[i][j]);
			if(ltemp<res)
			{
				res=ltemp;
			}
		}
	}
	out<<res<<endl;
	return ;
}