Cod sursa(job #2975810)
Utilizator | Data | 7 februarie 2023 17:01:08 | |
---|---|---|---|
Problema | Struti | Scor | 100 |
Compilator | cpp-64 | Status | done |
Runda | Arhiva de probleme | Marime | 6.04 kb |
#include <iostream>
#include <fstream>
#include <deque>
#include <climits>
using namespace std;
ifstream fin("struti.in");
ofstream fout("struti.out");
const int Nmax=1005;
int a[Nmax][Nmax],minv[Nmax][Nmax],maxv[Nmax][Nmax];
deque<int> dqmin;
deque<int> dqmax;
int main()
{
int m,n,p;
long long sol,nr;
fin>>m>>n>>p;
for(int i=1; i<=m; i++)
{
for(int j=1; j<=n; j++)
{
fin>>a[i][j];
}
}
for(int i=1; i<=p; i++)
{
int x,y;
fin>>x>>y;
///1->n y
for(int j=1; j<=m; j++)
{
for(int k=1; k<=n; k++)
{
minv[j][k]=0;
maxv[j][k]=0;
}
}
for(int j=1; j<=m; j++)
{
dqmin.clear();
dqmax.clear();
for(int k=1; k<=n; k++)
{
while(!dqmin.empty() && a[j][k]<a[j][dqmin.back()])
{
dqmin.pop_back();
}
dqmin.push_back(k);
if(dqmin.front()<=k-y)
{
dqmin.pop_front();
}
if(k>=y)
{
minv[j][k]=a[j][dqmin.front()];
}
while(!dqmax.empty() && a[j][k]>a[j][dqmax.back()])
{
dqmax.pop_back();
}
dqmax.push_back(k);
if(dqmax.front()<=k-y)
{
dqmax.pop_front();
}
if(k>=y)
{
maxv[j][k]=a[j][dqmax.front()];
}
}
}
sol=LLONG_MAX,nr=0;
for(int j=1; j<=n-y+1; j++)
{
dqmin.clear();
dqmax.clear();
for(int k=1; k<=m; k++)
{
while(!dqmin.empty() && minv[k][j+y-1]<minv[dqmin.back()][j+y-1])
{
dqmin.pop_back();
}
dqmin.push_back(k);
if(dqmin.front()<=k-x)
{
dqmin.pop_front();
}
while(!dqmax.empty() && maxv[k][j+y-1]>maxv[dqmax.back()][j+y-1])
{
dqmax.pop_back();
}
dqmax.push_back(k);
if(dqmax.front()<=k-x)
{
dqmax.pop_front();
}
if(k>=x)
{
int alt=maxv[dqmax.front()][j+y-1]-minv[dqmin.front()][j+y-1];
if(alt<sol)
{
sol=alt;
nr=1;
}
else if(alt==sol)
{
nr++;
}
///cout<<maxv[dqmax.front()][j+y-1]<<' '<<minv[dqmin.front()][j+y-1]<<' '<<k<<' '<<j<<' '<<i<<'\n';
}
}
}
///1->n x
if(x!=y)
{
int aux=y;
y=x;
x=aux;
for(int j=1; j<=m; j++)
{
for(int k=1; k<=n; k++)
{
minv[j][k]=0;
maxv[j][k]=0;
}
}
for(int j=1; j<=m; j++)
{
dqmin.clear();
dqmax.clear();
for(int k=1; k<=n; k++)
{
while(!dqmin.empty() && a[j][k]<a[j][dqmin.back()])
{
dqmin.pop_back();
}
dqmin.push_back(k);
if(dqmin.front()<=k-y)
{
dqmin.pop_front();
}
if(k>=y)
{
minv[j][k]=a[j][dqmin.front()];
}
while(!dqmax.empty() && a[j][k]>a[j][dqmax.back()])
{
dqmax.pop_back();
}
dqmax.push_back(k);
if(dqmax.front()<=k-y)
{
dqmax.pop_front();
}
if(k>=y)
{
maxv[j][k]=a[j][dqmax.front()];
}
}
}
for(int j=1; j<=n-y+1; j++)
{
dqmin.clear();
dqmax.clear();
for(int k=1; k<=m; k++)
{
while(!dqmin.empty() && minv[k][j+y-1]<minv[dqmin.back()][j+y-1])
{
dqmin.pop_back();
}
dqmin.push_back(k);
if(dqmin.front()<=k-x)
{
dqmin.pop_front();
}
while(!dqmax.empty() && maxv[k][j+y-1]>maxv[dqmax.back()][j+y-1])
{
dqmax.pop_back();
}
dqmax.push_back(k);
if(dqmax.front()<=k-x)
{
dqmax.pop_front();
}
if(k>=x)
{
int alt=maxv[dqmax.front()][j+y-1]-minv[dqmin.front()][j+y-1];
if(alt<sol)
{
sol=alt;
nr=1;
}
else if(alt==sol)
{
nr++;
}
///cout<<maxv[dqmax.front()][j+y-1]<<' '<<minv[dqmin.front()][j+y-1]<<' '<<k<<' '<<j<<' '<<i<<'\n';
}
}
}
}
fout<<sol<<' '<<nr<<'\n';
}
return 0;
}