Cod sursa(job #261923)

Utilizator znakeuJurba Andrei znakeu Data 18 februarie 2009 21:12:54
Problema Struti Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.78 kb
#include <stdio.h>
#include <stdlib.h>
#define MAXN 1024
struct toxicpie
{
	int v,p;
};

int v[MAXN][MAXN];
int T1[MAXN][MAXN];
int T2[MAXN][MAXN];
toxicpie D1[MAXN];
toxicpie D2[MAXN];
//int D1[MAXN];
//int D2[MAXN];

int M,N,P,m=0,r=0;

inline void chestie2(int X, int Y)
{
	int i,j,L1=0,L2=0,R1=0,R2=0,tt=0;
//	int T1[MAXN][MAXN];
//	int T2[MAXN][MAXN];
	m=8001; r=0;
	
	for (j=1; j<=M; ++j)
	{
		L1=L2=1; R1=R2=0;
		for (i=1; i<X; ++i)
		{
			while (L1<=R1 && v[i][j] >= D1[R1].v) --R1;
			D1[++R1].p = i; D1[R1].v=v[i][j];
			while (L2<=R2 && v[i][j] <= D2[R2].v) --R2;
			D2[++R2].p = i; D2[R2].v=v[i][j];			
			/*
			while (L1<=R1 && v[i][j] >= v[ D1[R1] ][j]) --R1;
			D1[++R1] = i;
			while (L2<=R2 && v[i][j] <= v[ D2[R2] ][j]) --R2;
			D2[++R2] = i;
			*/
		}
		for (i=X; i<=N; ++i)
		{
			
			while (L1<=R1 && v[i][j] >=D1[R1].v) --R1;
			D1[++R1].p = i; D1[R1].v=v[i][j];
			while (L2<=R2 && v[i][j] <= D2[R2].v) --R2;
			D2[++R2].p = i; D2[R2].v=v[i][j];
			
			if (D1[L1].p==i-X) ++L1;
			T1[i][j]=D1[L1].v;
			if (D2[L2].p==i-X) ++L2;
			T2[i][j]=D2[L2].v;
			/*
			while (L1<=R1 && v[i][j] >= v[ D1[R1] ][j]) --R1;
			D1[++R1] = i;
			while (L2<=R2 && v[i][j] <= v[ D2[R2] ][j]) --R2;
			D2[++R2] = i;
			
			if (D1[L1]==i-X) ++L1;
			T1[i][j]=v[ D1[L1] ][j];
			if (D2[L2]==i-X) ++L2;
			T2[i][j]=v[ D2[L2] ][j];
			*/
		}
	}	
	
	for (i=X; i<=N; ++i)
	{
		L1=L2=1; R1=R2=0;
		for (j=1; j<Y; ++j)
		{
			
			while (L1 <= R1 && T1[i][j] >=  D1[R1].v ) --R1; 
			D1[++R1].p = j; D1[R1].v = T1[i][j];
			while (L2 <= R2 && T2[i][j] <=  D2[R2].v ) --R2; 
			D2[++R2].p = j; D2[R2].v = T2[i][j];
			/*
			while (L1<=R1 && T1[i][j] >= T1[i][ D1[R1] ]) --R1;
			D1[++R1] = j;
			while (L2<=R2 && T2[i][j] <= T2[i][ D2[R2] ]) --R2;
			D2[++R2] = j;
			*/			
		}		
		for (j=Y; j<=M; ++j)
		{
			
			while (L1 <= R1 && T1[i][j] >=  D1[R1].v ) --R1; 
			D1[++R1].p = j; D1[R1].v = T1[i][j];
			while (L2 <= R2 && T2[i][j] <=  D2[R2].v ) --R2; 
			D2[++R2].p = j; D2[R2].v = T2[i][j];
			
			if (D1[L1].p==j-Y) ++L1;
			if (D2[L2].p==j-Y) ++L2;
			
			tt=D1[L1].v - D2[L2].v;			
			/*
			while (L1<=R1 && T1[i][j] >= T1[i][ D1[R1] ]) --R1;
			D1[++R1] = j;
			while (L2<=R2 && T2[i][j] <= T2[i][ D2[R2] ]) --R2;
			D2[++R2] = j;
			
			if (D1[L1]==j-Y) ++L1;
			if (D2[L2]==j-Y) ++L2;
			
			tt=T1[i][D1[L1]]-T2[i][D2[L2]];
			*/
			if (tt==m) r++;
			if (tt<m) {m=tt; r=1;}			
		}
	}	
}

int main()
{
	freopen("struti.in","r",stdin);
	freopen("struti.out","w",stdout);
	
	int i,j,m2,r2,X,Y;
	char s[MAXN*6];
	
	gets(s); i=0;
	
	while (s[i]>='0' && s[i]<='9')
		N=N*10+s[i++]-'0';
	while (s[i]<'0' || s[i]>'9')
		++i;
	while (s[i]>='0' && s[i]<='9')
		M=M*10+s[i++]-'0';
	while (s[i]<'0' || s[i]>'9')
		++i;
	while (s[i]>='0' && s[i]<='9')
		P=P*10+s[i++]-'0';
	
	if (M>=N)
	{
		for (i=1; i<=N; ++i)
		{
			gets(s); X=0;
			for (j=1; j<=M; ++j)
			{
				Y=0;
				while (s[X]<'0' || s[X]>'9')
					++X;
				while (s[X]>='0' && s[X]<='9')
					Y=Y*10+s[X++]-'0';				
				v[i][j]=Y;				
			}			
		}
	}
	else
	{
		
		for (i=1; i<=N; ++i)
		{
			gets(s); X=0;
			for (j=1; j<=M; ++j)
			{
				Y=0;
				while (s[X]<'0' || s[X]>'9')
					++X;
				while (s[X]>='0' && s[X]<='9')
					Y=Y*10+s[X++]-'0';		
				v[j][i]=Y;				
			}			
		}
		M=M+N; N=M-N; M=M-N;			
	}
	
	for (j=0; j<P; ++j)
	{
		i=0; gets(s); X=0; Y=0;
		while (s[i]>='0' && s[i]<='9')
			X=X*10+s[i++]-'0';
		while (s[i]<'0' || s[i]>'9')
			++i;
		while (s[i]>='0' && s[i]<='9')
			Y=Y*10+s[i++]-'0';
		
		
		chestie2(X,Y); m2=m; r2=r;
		if (X!=Y)
		{
			chestie2(Y,X);
			if (m2==m) r2+=r;
			if (m2>m) { m2=m; r2=r;}		
		}
		
		printf("%d %d\n",m2,r2);		
	}	
	
	fclose(stdin);
	fclose(stdout);
	return 0;
}