[Poj #2019] Cornfields

badge:标签-数据结构
一维静态RMQ?st表。
好的你变成了二维。
没事,二维st表。

#include<cstdio>
using namespace std;
const int LG=8;
const int inf=0x7f7f7f7f;
int n,m;
int st1[256][256][LG][LG];
int st2[256][256][LG][LG];
int a[256][256];
int maxf(int x,int y){return x>y?x:y;}
int minf(int x,int y){return x<y?x:y;}
int logn[256];
void prepare()
{
	int i,j,k,_n,_m,h,l;
	for(i=1;i<=n;i++)
	for(j=1;j<=m;j++)
	st1[i][j][0][0]=st2[i][j][0][0]=a[i][j];
	logn[1]=0;
	for(i=2;i<=255;i++)logn[i]=logn[i>>1]+1;
	_n=logn[n];_m=logn[m];
	for(h=0;h<=_n;h++)
	{
		for(l=0;l<=_m;l++)
		{
			if(!h&&!l)continue;
			for(i=1;i<=n;i++)
			{
				for(j=1;j<=m;j++)
				{
					if(l)st1[i][j][h][l]=maxf(st1[i][j][h][l-1],st1[i][j+(1<<(l-1))][h][l-1]);
					else st1[i][j][h][l]=maxf(st1[i][j][h-1][l],st1[i+(1<<(h-1))][j][h-1][l]);
					if(l)st2[i][j][h][l]=minf(st2[i][j][h][l-1],st2[i][j+(1<<(l-1))][h][l-1]);
					else st2[i][j][h][l]=minf(st2[i][j][h-1][l],st2[i+(1<<(h-1))][j][h-1][l]);
				}
			}
		}
	}
	return;
}
int x2,y2,ans;
int querymax(int x,int y,int h,int l)
{
	x2=x+h-1,y2=y+l-1;
	h=logn[h];l=logn[l];ans=-inf;
	ans=maxf(st1[x][y][h][l],st1[x][y2-(1<<l)+1][h][l]);
	ans=maxf(ans,maxf(st1[x2-(1<<h)+1][y][h][l],st1[x2-(1<<h)+1][y2-(1<<l)+1][h][l]));
	return ans;
}
int querymin(int x,int y,int h,int l)
{
	x2=x+h-1,y2=y+l-1;
	h=logn[h];l=logn[l];ans=inf;
	ans=minf(st2[x][y][h][l],st2[x][y2-(1<<l)+1][h][l]);
	ans=minf(ans,minf(st2[x2-(1<<h)+1][y][h][l],st2[x2-(1<<h)+1][y2-(1<<l)+1][h][l]));
	return ans;
}
int main()
{
	int i,j,k,x,y,z,q,b;
	scanf("%d%d%d",&n,&b,&q);
	m=n;
	for(i=1;i<=n;i++)
	{
		for(j=1;j<=m;j++)
		scanf("%d",&a[i][j]);
	}
	prepare();
	for(i=1;i<=q;i++)
	{
		scanf("%d%d",&x,&y);
		printf("%d\n",querymax(x,y,b,b)-querymin(x,y,b,b));
	}
	return 0;
}
posted @ 2019-10-24 18:33  Rain_142857  阅读(88)  评论(0编辑  收藏  举报