Cod sursa(job #2050802)

Utilizator refugiatBoni Daniel Stefan refugiat Data 28 octombrie 2017 11:27:06
Problema Struti Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 3.9 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <deque>
using namespace std;
ifstream si("struti.in");
ofstream so("struti.out");
deque<int> dmin;
deque<int> dmax;
int v[1005][1005];
int max1[1005][1005];
int max2[1005][1005];
int min1[1005][1005];
int min2[1005][1005];
int n,m,p;
int calc(int sol,int x,int y)
{
    int cont=0;
    for(int i=1;i<=n-y+1;i++)
    {
        for(int j=1;j<=m-x+1;j++)
        {
            if(max2[i][j]-min2[i][j]==sol)
            {
                cont++;
            }
        }
    }
    return cont;
}

pair<int,int> rez(int x,int y)
{
    for(int i=1;i<=n;i++)
    {
        dmin.clear();
        dmax.clear();
        for(int j=1;j<=x;j++)
        {
            while(dmin.size()&&v[i][j]<=v[i][dmin.back()])
            {
                dmin.pop_back();
            }
            while(dmax.size()&&v[i][j]>=v[i][dmax.back()])
            {
                dmax.pop_back();
            }
            dmin.push_back(j);
            dmax.push_back(j);
        }
        min1[i][1]=v[i][dmin.front()];
        max1[i][1]=v[i][dmax.front()];
        for(int j=x+1;j<=m;j++)
        {

            if(dmin.front()<=j-x)
            {
                dmin.pop_front();
            }
            if(dmax.front()<=j-x)
            {
                dmax.pop_front();
            }
            while(dmin.size()&&v[i][j]<=v[i][dmin.back()])
            {
                dmin.pop_back();
            }
            while(dmax.size()&&v[i][j]>=v[i][dmax.back()])
            {
                dmax.pop_back();
            }
            dmin.push_back(j);
            dmax.push_back(j);
            min1[i][j-x+1]=v[i][dmin.front()];
            max1[i][j-x+1]=v[i][dmax.front()];
        }
    }

    for(int j=1;j<=m-x+1;j++)
    {
        dmin.clear();
        dmax.clear();
        for(int i=1;i<=y;i++)
        {
            while(dmin.size()&&min1[i][j]<=min1[dmin.back()][j])
            {
                dmin.pop_back();
            }
            while(dmax.size()&&max1[i][j]>=max1[dmax.back()][j])
            {
                dmax.pop_back();
            }
            dmin.push_back(i);
            dmax.push_back(i);
        }
        min2[1][j]=min1[dmin.front()][j];
        max2[1][j]=max1[dmax.front()][j];
        for(int i=y+1;i<=n;i++)
        {
            if(dmin.front()<=i-y)
            {
                dmin.pop_front();
            }
            if(dmax.front()<=i-y)
            {
                dmax.pop_front();
            }
            while(dmin.size()&&min1[i][j]<=min1[dmin.back()][j])
            {
                dmin.pop_back();
            }
            while(dmax.size()&&max1[i][j]>=max1[dmax.back()][j])
            {
                dmax.pop_back();
            }
            dmin.push_back(i);
            dmax.push_back(i);
            min2[i-y+1][j]=min1[dmin.front()][j];
            max2[i-y+1][j]=max1[dmax.front()][j];
        }
    }
    int sol=1000000000;
    for(int i=1;i<=n-y+1;i++)
    {
        for(int j=1;j<=m-x+1;j++)
        {
            sol=min(max2[i][j]-min2[i][j],sol);
        }
    }
    int cnt=calc(sol,x,y);
    return make_pair(sol,cnt);
}

int main()
{
    si>>n>>m>>p;
    for(int i=1;i<=n;++i)
        for(int j=1;j<=m;++j)
            si>>v[i][j];
    while(p--)
    {
        int x,y;
        si>>x>>y;
        pair<int,int>sol1=rez(x,y);
        if(x==y)
        {
            so<<sol1.first<<' '<<sol1.second<<'\n';
            continue;
        }
        pair<int,int>sol2=rez(y,x);
        if(sol1.first==sol2.first)
        {
            so<<sol1.first<<' '<<sol2.second+sol1.second<<'\n';
            continue;
        }
        if(sol1.first>sol2.first)
            so<<sol2.first<<' '<<sol2.second<<'\n';
        else
            so<<sol1.first<<' '<<sol1.second<<'\n';
    }

    return 0;
}