Mai intai trebuie sa te autentifici.
Cod sursa(job #434714)
Utilizator | Data | 6 aprilie 2010 14:28:07 | |
---|---|---|---|
Problema | Struti | Scor | 70 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 2.64 kb |
#include<cstdio>
#include<cstring>
#define N 1024
struct pss
{
short fs,sc;
};
short m,n,p;
short a[N][N];
pss dmin[N][N];
pss dmax[N][N];
short pmin[N],pmax[N];
short rez1;
int rez2;
inline void citire()
{
scanf("%hd%hd%hd\n",&m,&n,&p);
char c[6*N]={0};
for(short i=1; i<=m; ++i)
{
fgets(c,6*N,stdin);
short x,i1=0;
for(short j=1; j<=n; ++j)
{
x=0;
for(; c[i1]>='0' && c[i1]<='9'; ++i1)
x=x*10+(c[i1]-'0');
++i1;
a[i][j]=x;
}
}
}
inline void vezi(short dx,short dy)
{
pss emin[N],emax[N];
emin[0].fs=emax[0].fs=0;
short qmin=1,qmax=1;
short x,y;
for(short i=1; i<dx; ++i)
{
for(int j=1; j<=n; ++j)
{
x=a[i][j];
while(dmin[j][0].fs>=pmin[j] && dmin[j][dmin[j][0].fs].sc>=x)
--dmin[j][0].fs;
dmin[j][++dmin[j][0].fs].fs=i;
dmin[j][dmin[j][0].fs].sc=x;
while(dmax[j][0].fs>=pmax[j] && dmax[j][dmax[j][0].fs].sc<=x)
--dmax[j][0].fs;
dmax[j][++dmax[j][0].fs].fs=i;
dmax[j][dmax[j][0].fs].sc=x;
}
}
for(short i=dx; i<=m; ++i)
{
qmin=qmax=1;
emin[0].fs=emax[0].fs=0;
for(short j=1; j<=n; ++j)
{
x=a[i][j];
if(dmin[j][0].fs>=pmin[j] && i-dmin[j][pmin[j]].fs==dx)
++pmin[j];
while(dmin[j][0].fs>=pmin[j] && dmin[j][dmin[j][0].fs].sc>=x)
--dmin[j][0].fs;
dmin[j][++dmin[j][0].fs].fs=i;
dmin[j][dmin[j][0].fs].sc=x;
if(dmax[j][0].fs>=pmax[j] && i-dmax[j][pmax[j]].fs==dx)
++pmax[j];
while(dmax[j][0].fs>=pmax[j] && dmax[j][dmax[j][0].fs].sc<=x)
--dmax[j][0].fs;
dmax[j][++dmax[j][0].fs].fs=i;
dmax[j][dmax[j][0].fs].sc=x;
x=dmin[j][pmin[j]].sc;
if(emin[0].fs>=qmin && j-emin[qmin].fs==dy)
++qmin;
while(emin[0].fs>=qmin && emin[emin[0].fs].sc>=x)
--emin[0].fs;
emin[++emin[0].fs].fs=j;
emin[emin[0].fs].sc=x;
x=dmax[j][pmax[j]].sc;
if(emax[0].fs>=qmax && j-emax[qmax].fs==dy)
++qmax;
while(emax[0].fs>=qmax && emax[emax[0].fs].sc<=x)
--emax[0].fs;
emax[++emax[0].fs].fs=j;
emax[emax[0].fs].sc=x;
if(j<dy)
continue;
x=emin[qmin].sc;
y=emax[qmax].sc;
y-=x;
if(y<rez1)
{
rez1=y;
rez2=1;
}
else
if(y==rez1)
++rez2;
}
}
}
int main()
{
freopen("struti.in","r",stdin);
freopen("struti.out","w",stdout);
citire();
short x,y;
for(short i=0; i<p; ++i)
{
rez1=20010;
rez2=0;
scanf("%hd%hd",&x,&y);
for(short j=1; j<=n; ++j)
{
pmin[j]=pmax[j]=1;
dmin[j][0].fs=dmax[j][0].fs=0;
}
vezi(x,y);
if(x!=y)
{
for(short j=1; j<=n; ++j)
{
pmin[j]=pmax[j]=1;
dmin[j][0].fs=dmax[j][0].fs=0;
}
vezi(y,x);
}
printf("%hd %d\n",rez1,rez2);
}
return 0;
}